#干货文:java多线程高级教程,这些你都懂了吗?

一、countdownLatch和cyclicbarrier(这两个做多线程控制很好用,工作中会经常用到)

countdownLatch:主线程阻塞,当多个线程countdown到0,主线程执行;

cyclicbarrier:多个线程等待,当都处于等待状态了一起执行(类似于赛跑机制)
如果有想要学习java的小伙伴,可来我们的java学习扣裙哦:72340,3928里面赠送java系列教学视频和资料!小编也是从事了6年java开发的全栈工程师,欢迎初学者和想要进阶的同学进来一起学习。
在这里插入图片描述
countdownLatch
在这里插入图片描述
cyclicbarrier

二、volatile和threadlocal

这两个也要很好掌握,不仅常用,而且面试时候也经常问到!

volatile:使属性可见性。有个属性是共享属性,这个关键字会在每个线程内开一块内存,每次子线程都会从主线程拿最新的属性放到内存中。但是有个问题,他只是拿最新的,比如:计数器,每个线程都执行+1操作。一个线程+1,另外两个同时读取这个属性,那么不会加2次,而是只加一次,这就是valatile不能保证原子性的原因。

threadlocal:用于做方法外的全局属性。这个跟volatile刚好相反,使全局变量独立,每个线程里都有一份独立副本。
在这里插入图片描述
这是hibernate的源码,如果当前线程没有session就openSession放到ThreadLocalMap中,每个线程的session都是独立的不会相互受影响。

三、AtomicInteger:支持原子性计数器。

之前说volatile不能作为计数器,那么多线程计数器要用atomic类的AtomicInteger
在这里插入图片描述
四、并发类容器

ConCurrentHashMap、CopyAndWriteArrayList、CopyAndWriteArraySet。

ConCurrentHashMap(底层分成16个hashtable来保证并发)读支持高并发读,写和删除时候只支持16个线程,所以一般也要上锁; copyandwrite支持高并发读,写的话要加锁(原理是,写的时候赋值一个容器,写好了把指针指向新容器并且删除原容器)

map、list、set都有并发类容器。面试时候经常会问hashmap和ConCurrentHashMap区别。这个demo我就不写了,用法和我们平时用的集合都一样,只是他们不会造成线程不安全。

猜你喜欢

转载自blog.csdn.net/javam16/article/details/82793306
今日推荐