猿创征文|点亮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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。

    用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。

    2021年11月22日
    52
  • Linux下nginx的安装以及环境配置「建议收藏」

    Linux下nginx的安装以及环境配置「建议收藏」linux下nginx的安装以及环境配置刚好最近在处理服务器相关的工作,所以记录一下nginx的安装,ok,接下来直接开始操作!第一步:下载nginx压缩包在这里可以去nginx官网下载->点我下载nginx也可以直接使用wget命令下载,指令如下所示(请根据自己的需求进行下载):wget-chttps://nginx.org/download/nginx-1.10.1.tar…

    2022年6月7日
    80
  • python ==和is_python中isdigit函数

    python ==和is_python中isdigit函数前置知识点当我们创建一个对象时,我们要知道它内部干了些什么1.创建了一个随机id,开辟了一片内存地址2.自动声明了这个对象的类型type3.给这个对象赋值value小例子a=1pri

    2022年7月31日
    5
  • 【织梦插件】xenu软件-网站url和死链提取工具免费下载[通俗易懂]

    【织梦插件】xenu软件-网站url和死链提取工具免费下载[通俗易懂]软件名称 xenu 软件作用 网站网址提取工具 适宜人群 SEO 网址 http://www.jingdouwang.cn/zygx/wzcj/278.html 软件简介:  XenuLinkSleuth可能是你所见功能最强大的网站死链接查询的软件了。使用方法简单,仅需要输入网站URL就可以完成死链查询。用户可直接查看死链和火炼,…

    2022年7月22日
    13
  • Hadoop生态圈的核心组件包括哪些

    Hadoop生态圈的核心组件包括哪些Hadoop生态圈的核心组件包括哪些Hadoop是现在最流行的大数据分布式基础架构,其实现了很多大数据相关的核心功能,并且支持大量的核心项目。那么,今天小编就给大家盘点一下Hadoop生态圈核心组件,感兴趣的小伙伴快来学习下吧!1、Hbase:一个基于列的存储的分布式数据库,其数据模型为Key-Value模式,便于扩展并且查询高效。2、Hive:Hive是Hadoop提供的一个数据仓库,也提供数据库部分功能。其最大的作用还是简化了编写MapReduce程序的过程,只需要利用SQL语句即可完成MapRe

    2022年5月11日
    41
  • 分形之谢尔宾斯基(Sierpinski)地毯

    分形之谢尔宾斯基(Sierpinski)地毯前面讲了谢尔宾斯基三角形,和这一节的将把三角形变为正方形,即谢尔宾斯基地毯,它是由瓦茨瓦夫·谢尔宾斯基于1916年提出的一种分形,是自相似集的一种。谢尔宾斯基地毯的构造与谢尔宾斯基三角形相似

    2022年7月4日
    50

发表回复

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

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