Java并发编程
liuhmmjj
对计算机编程很有兴趣
展开
-
volatile关键字原理
volatile可以保证一定程度上有序性,即volatile前面的代码先于后面的代码先执行。但是前、后代码,各自里面的顺序性是无法保证的。volatile可以保证共享变量内存可见性:volatile变量修饰的共享变量在进行写操作的时候回多出一行汇编:0x01a3de1d:movb $0×0,0×1104800(%esi);0x01a3de24:lock addl $0×0,(%es...原创 2019-12-10 15:17:30 · 5380 阅读 · 0 评论 -
使用Condition实现生产者消费者
使用Condtion实现生产者消费者可以精确控制唤醒生产者还是消费者线程与synchronized的等待唤醒机制相比Condition具有更多的灵活性以及精确性,这是因为notify()在唤醒线程时是随机(同一个锁),而Condition则可通过多个Condition实例对象建立更加精细的线程控制,也就带来了更多灵活性了,我们可以简单理解为以下两点 通过Condition能够精细的控制多...原创 2018-11-10 11:25:21 · 10373 阅读 · 0 评论 -
FutureTask源码解析(JDK1.8)
在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。下面分析其源码:Callable接口//Runnable是没有返回结果的任务,而Callable则是有返回结果的任务...原创 2018-07-24 11:14:24 · 5839 阅读 · 1 评论 -
Java中的CopyOnWrite容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。转载 2016-08-14 14:37:09 · 437 阅读 · 0 评论 -
Java HashMap的死循环
在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为Java的HashMap是非线程安全的,所以在并发下必然出现问题。但是,我发现近几年,很多人都经历过这个事(在网上查“HashMap Infinite Loo转载 2016-08-13 18:09:45 · 748 阅读 · 0 评论 -
ConcurrentHashMap、synchronized与线程安全
最近做的项目中遇到一个问题:明明用了ConcurrentHashMap,可是始终线程不安全除去项目中的业务逻辑,简化后的代码如下:[java] view plain copypublic class Test40 { public static void main(String[] args) throws In转载 2016-08-13 18:05:42 · 841 阅读 · 0 评论 -
深入分析ConcurrentHashMap
ConcurrentHashMap的目的多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。虽然已经有一个线程安全的HashTable,但是HashTable容器使用synchronized(他的get和put方法的实现代码如下)来保证线程安全,在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线原创 2016-08-13 18:02:02 · 5892 阅读 · 0 评论 -
线程技术之死锁问题
我们知道,使用synchronized关键字可以有效的解决线程同步问题,但是如果不恰当的使用synchronized关键字的话也会出问题,即我们所说的死锁。死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 下面写一个死锁的例子加深理解。先看程序,再来分析一下死锁产生的原因:public class转载 2016-09-15 20:19:20 · 4296 阅读 · 0 评论 -
Java 多线程之join
Java多线程之join1.join方法只有在继承了Thread类的线程中才有。2.线程必须要start()后再join才能起作用。JDK的解释:join public final void join(long millis)throws InterruptedException Waits at most millis milliseconds for this thre原创 2016-09-15 19:49:52 · 10017 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier 字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。 CyclicBarrier类位于java.util.concurrent包下,CyclicB转载 2016-09-03 14:56:29 · 4224 阅读 · 0 评论 -
CountDownLatch
CountDownLatch CountDownLatch是在java1.5被引入的,存在于java.util.concurrent包下。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。 CountDownLatch是通过一个计数器来实现的,计数器的初始值为线...原创 2016-09-03 14:27:58 · 9875 阅读 · 0 评论 -
深入理解ThreadLocal
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。线程局部变量(ThreadLocal)的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的...原创 2016-08-13 19:45:13 · 6766 阅读 · 0 评论 -
ArrayBlockingQueue源码分析及使用
BlockingQueue介绍与常用方法BlockingQueue是一个阻塞队列。在高并发场景是用得非常多的,在线程池中。如果运行线程数目大于核心线程数目时,也会尝试把新加入的线程放到一个BlockingQueue中去。队列的特性就是先进先出很容易理解,在java里头它的实现类主要有下图的几种,其中最常用到的是ArrayBlockingQueue、LinkedBlockingQueue原创 2016-08-15 22:14:15 · 15746 阅读 · 0 评论