前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java多线程高级教程,这些你都懂了吗?

java多线程高级教程,这些你都懂了吗?

作者头像
java架构师
发布2018-08-23 10:43:58
5910
发布2018-08-23 10:43:58
举报
文章被收录于专栏:Java架构师进阶Java架构师进阶

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

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

cyclicbarrier:多个线程等待,当都处于等待状态了一起执行(类似于赛跑机制)

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我就不写了,用法和我们平时用的集合都一样,只是他们不会造成线程不安全。

五、并发类队列

阻塞的意思是,当达到队列最大容量或者为空,线程还往里加东西或取东西会被阻塞;有界意思,可以设置队列大小。

(非阻塞队列)ConcurrentLinkedQueue无阻塞无界限队列(高并发性能最好,peek取出不删除,poll取出删除),

(阻塞队列)ArrayBlockingQueue阻塞有界队列,LinkBlockingQueue阻塞无界队列(生产者消费者首选,take方法会阻塞,poll方法没有就返回null)。

这里我们以最经典的生产者消费者模式作为例子

这里我们顺便做一个延伸,我们用的所有线程池,包括面试时候经常问的要你自定义一个线程池怎么做?我们先看一下线程池的源码。

也就是说线程池也是用并发队列作为线程的容器。我们自定义时候也只需要重现实例化ThreadPoolExcutor,设置我们自己需要的参数即可。

六、分布式锁

这个其实已经不属于java代码范畴,但是我上一篇讲基础的时候,一些兄弟说我说的太简单,另一些又说太难,所以我加了一个分布式锁,希望能满足更多人需求。

分布式锁,主要用在分布式集群上,既然是分布式,那就有多个jvm,即使你代码写出花来也不能控制。所以只有一个办法就是借助第三方工具。比如memcache、redis、zk

1. 首先明确一点,有人可能会问是否可以考虑采用ReentrantLock来实现,但是实际上去实现的时候是有问题的,ReentrantLock的lock和unlock要求必须是在同一线程进行,而分布式应用中,lock和unlock是两次不相关的请求,因此肯定不是同一线程,因此导致无法使用ReentrantLock。

2. 基于数据库表做乐观锁,用于分布式锁。

3. 使用memcached的add()方法,用于分布式锁。

4. 使用memcached的cas()方法,用于分布式锁。(不常用)

5. 使用redis的setnx()、expire()方法,用于分布式锁。

6. 使用redis的setnx()、get()、getset()方法,用于分布式锁。(本人最常用的也是唯一用的方法)

7. 使用redis的watch、multi、exec命令,用于分布式锁。(不常用)

8. 使用zookeeper,用于分布式锁。(不常用)

这个我就不举demo了,不然太多了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.04.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档