猿创征文|点亮JAVA技术之灯(线程篇)「建议收藏」

猿创征文|点亮JAVA技术之灯(线程篇)「建议收藏」线程安全就是说多线程访问同一段代码,不会产生不确定的结果。又是一个理论的问题,各式各样的答案有很多,我给出一个个人认为解释地最好的:如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。(1)不可变像String、Integer、Long这些,都是final类型的类,任何一个线程都改变不了它们的值,要改变除非新创建一个,因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用(2)绝对线程安全不管运行时环境如何,调用者都不需要额外的同步措施。……….

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

✅作者简介:

            全栈领域新星创作者,阿里云专家博主,退役复学在校学生

?推荐学习专栏:

                             Spring系列

                             Spring Boot 系列

                              秋招面试题

                             再次渡入繁世,人潮汹涌,眼里茫然,信仰永恒,皆为华夏   

猿创征文|点亮JAVA技术之灯(线程篇)「建议收藏」

 目录

写给读者

初始JAVA

多线程

1、有三个线程T1,T2,T3,如何保证顺序执行?

2、SynchronizedMap和ConcurrentHashMap有什么区别?

3、什么是线程安全

总结


写给读者

        大家好,借着本次猿创征文活动我将分享一下自己的JAVA技术的成长之路。其实对于我来说刚开始学习JAVA还是很吃力的,之前都没有接触到计算机领域和编程相关的知识,刚回到地方的时候,是十月份这对我来说,更比其他人更晚的接触到这个编程领域,当时我身为计科的学生,学校并没有给我们安排C语言的课程,直接给我安排上了JAVA,至此我跟JAVA结下了一段孽缘。当时有两门语言让我头大,一门语言是英语,另一门语言就是JAVA,现在回想起来欲哭无泪。


初始JAVA

当时刚学JAVA的时候,纯的跟白开水一样纯的小白什么编译器、环境变量等,对当时的我根本就是两眼摸黑,无计可施,当时没上完一个阶段就要布置一个实践报告,要我们写代码,我只能在CSDN上面搜索代码copy上去,讲实话自我感觉根本没学到什么东西。后来遇见一些有趣的人,让我觉得JAVA这门语言也并不是那么苦涩难懂,开启我的兴趣,从此我跟JAVA结下了一段孽缘


多线程

我认为学习JAVA这么语言,多线程这个至关重要,下面是我遇见的一些线程问题,整理出来跟大家一起分享。

1、有三个线程T1,T2,T3,如何保证顺序执行?

在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。

实际上先启动三个线程中哪一个都行, 因为在每个线程的run方法中用join方法限定了三个线程的执行顺序。

public class JoinTest2 {

// 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行

public static void main(String[] args) {

final Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

System.out.println("t1");

}

});

final Thread t2 = new Thread(new Runnable() {

@Override

public void run() {

try {

// 引用t1线程,等待t1线程执行完

t1.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("t2");

}

});

Thread t3 = new Thread(new Runnable() {

@Override

public void run() {

try {

// 引用t2线程,等待t2线程执行完

t2.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("t3");

}

});

t3.start();//这里三个线程的启动顺序可以任意,大家可以试下! t2.start();

t1.start();

}

}

Jetbrains全家桶1年46,售后保障稳定

2、SynchronizedMap和ConcurrentHashMap有什么区别?

SynchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步。而ConcurrentHashMap的实现却更加精细,它对map中的所有桶加了锁。所以,只要有一个线程访问map,其他线程就无法进入map,而如果一个线程在访问ConcurrentHashMap某个桶时,其他线程,仍然可以对map执行某些操作。

所以,ConcurrentHashMap在性能以及安全性方面,明显比Collections.synchronizedMap()更加有优势。同时,同步操作精确控制到桶,这样,即使在遍历map时,如果其他线程试图对map进行数据修改,也不会抛出ConcurrentModificationException。

3、什么是线程安全

线程安全就是说多线程访问同一段代码,不会产生不确定的结果。

又是一个理论的问题,各式各样的答案有很多,我给出一个个人认为解释地最好的:如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。

这个问题有值得一提的地方,就是线程安全也是有几个级别的:

(1)不可变

像String、Integer、Long这些,都是final类型的类,任何一个线程都改变不了它们的值,要改变除非新创建一个,因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用

(2)绝对线程安全

不管运行时环境如何,调用者都不需要额外的同步措施。要做到这一点通常需要付出许多额外的代价,Java中标注自己是线程安全的类,实际上绝大多数都不是线程安全的,不过绝对线程安全的

类,Java中也有,比方说CopyOnWriteArrayList、CopyOnWriteArraySet

(3)相对线程安全

相对线程安全也就是我们通常意义上所说的线程安全,像Vector这种,add、remove方法都是原子操作,不会被打断,但也仅限于此,如果有个线程在遍历某个Vector、有个线程同时在add这个

Vector,99%的情况下都会出现ConcurrentModificationException,也就是fail-fast机制。

(4)线程非安全

这个就没什么好说的了,ArrayList、LinkedList、HashMap等都是线程非安全的类


总结

有关我的JAVA技术成长之路分享就到此结束了,希望通过我的这篇文章能帮大家点亮JAVA技术之灯,希望有一天我们能够顶峰相见,笑看风云。

                                       

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200640.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ROS机器人里程计模型

    ROS机器人里程计模型3.5移动机器人系统模型相信大家的机器人平台STM32端底层控制和机器人urdf建模都已经顺利完成了,在正式开始ros端编写机器人启动功能包之前,我们还不得不学习一些必要的理论知识。别担心数学不好,这里基本都是高中数学。下面我们开始,Areyouready?没准备好也开始了。3.5.1常用坐标系系统模型在移动机器人技术研究中,最为常用的坐标系统是笛卡尔坐标系统。而在SLAM算法研究中,有如下几个比较常见的笛卡尔坐标系统,它们分别为机器人坐标系XRYROR、传感器坐标系XSYSOS

    2022年6月30日
    28
  • 【第01题】A + B | 基础输入输出,开启学习C语言打卡的序章

    【第01题】A + B | 基础输入输出,开启学习C语言打卡的序章难度:★☆☆☆☆,开启学习C语言打卡的序章

    2022年7月24日
    9
  • App测试面试题_软件测试算法面试题汇总

    App测试面试题_软件测试算法面试题汇总1.Web端测试和App端测试有何不同(常见)系统结构方面Web项目,b/s架构,基于浏览器的;Web测试只要更新了服务器端,客户端就会同步会更新;App项目,c/s结构的,必须要有客户端;App修改了服务端,则客户端用户所有核心版本都需要进行回归测试一遍;兼容方面Web项目:a.浏览器(火狐、谷歌、IE等)b.操作系统(Windows7、Windows10、Linux等)App项目:a.设备系统:iOS(ipad、iphone)、Android(三星、华为、联想等)、

    2022年8月29日
    8
  • 计算机中进制转换方法_电脑进制转换方法

    计算机中进制转换方法_电脑进制转换方法计算机进制转换方法从小我们就开始学数学数学就有涉及到进制知识相信大家对于进制都不陌生吧进制也就是进位制是一种进位方法现在大家都有电脑利用电脑自带的计算机进行进制转换是最简便的方法下面是由百分网小编为大家准备的计算机进制转换方法喜欢的可以收藏一下!了解更多详情资讯请关注应届毕业生考试网!计算机中常用的进制主要有:二进制、八进制、十六进制学习计算机要对其有所了解2进制用两个阿拉伯数字:0、1;8进制用…

    2025年8月1日
    5
  • linux共享文件夹权限设置_修改权限linux

    linux共享文件夹权限设置_修改权限linuxLinux共享文件夹方法1:赋权限chmod777(共享文件夹路径)结果:赋权失败方法2:添加到组分析:给用户权限可以看两个地方,首先第一列是权限情况,分别为超级管理员root用户,组用户,普通用户。经查看我们发现share文件夹,root用户和组用户都有权限,然后我们查看第四列组用户的组名为vboxsf解决思路:把普通用户添加到vboxsf组里面,然后重启。#登陆到普通用户,输入如下命令sudousermod-a-Gvboxsf$(whoami)#

    2025年7月11日
    6
  • pip安装scrapy失败_scrapy框架运行

    pip安装scrapy失败_scrapy框架运行错误如图所示,running setup.py install for Twisted…..errorTwisted依赖库安装报错,重新下载手动安装一下下载网址:https://www.lfd.uci.edu/~gohlke/pythonlibs注意:看下安装的python是什么版本,我安装的python 3.9.0,就下载cp39,64位的下载安装的版本不对,就会报:Twisted-20.3.0-cp38-cp38-win_amd64.whl is not a support…

    2022年8月19日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号