java并发
文章平均质量分 68
向程序猿进化
这个作者很懒,什么都没留下…
展开
-
volatile的实现原理
关键字volatile是JVM提供的最轻量级的同步机制为什么要使用VolatileVolatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。Java内存模型对volatile专门定义了一些特殊的访问规则,当一个变量被定义成volatile之后,他将具备两种特性:1、保证此变量对所有线程的可见性。2、禁止...原创 2018-08-16 19:12:09 · 718 阅读 · 0 评论 -
创建线程的三种方式
一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。二、通过Runnable接口创建线程类(1)定义runnable接口的实现类,并重写该接口的run()方法,该...原创 2018-08-16 19:40:55 · 313 阅读 · 0 评论 -
ABA问题的解决方法
CAS操作可能带来ABA问题,因为CAS操作需要在操作值的时候,检查值有没有发生变化,如果没有发发生变化则更新。如果一个值原理是A,变成了B,又变成了A,那么使用CAS进行检查时会认为它的值没有变化,但是实际上却变了。ABA问题的解决办法就是使用版本号,在变量前面追加版本号,每次变量更新时把版本号加1,那么A-B-A就会变成1A-2B-3A。从jdk1.5开始,jdk中的Atomic包里提...原创 2018-08-16 19:39:47 · 9634 阅读 · 0 评论 -
ThreadLocal
对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量(实际上,这项工作需要程序员自己实现),因此可以同时访问而互不影响。比如,要让100个人填一张表,如果只有一支笔。对于管理人员必须保证大家不会哄抢这一支笔,否则,大家都填不完。从另一个角度,我们可以准备...原创 2018-08-16 19:38:18 · 2083 阅读 · 0 评论 -
线程池
什么是线程池合理使用线程池的好处:线程池的实现原理参考博客:https://blog.csdn.net/mine_song/article/details/70948223ThreadPoolExecutor大的实箭头表示继承(箭头尾是子类),大的虚箭头表示实现,小的实箭头表示表示关联即Executors中有ThreadPoolExecutor的实例引用。Thr...原创 2018-08-16 19:33:53 · 158 阅读 · 0 评论 -
ReentrantLock 重入锁(互斥锁)
参考博客:https://blog.csdn.net/jiangjiajian2008/article/details/52226189Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的与synchronized相比,重入锁有着显式的操作过程,开发人员必须手动的指定何时加锁(调用lock方法),何时释放锁(调用unlock方法)。因此,重入锁对逻辑的控...原创 2018-08-16 19:22:57 · 3334 阅读 · 0 评论 -
AQS,同步器框架(AbstractQueuedSynchronizer,队列同步器)
参考博客:https://blog.csdn.net/vernonzheng/article/details/8275624https://www.cnblogs.com/200911/p/6031350.html而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。juc里所有的这些锁机制都是基于AQS(AbstractQueu...原创 2018-08-16 19:18:42 · 679 阅读 · 0 评论 -
happens-before(先行发生原则)
JSR-133使用happens-before的概念来阐述操作之间内存的可见性,在JMM中如果一个操作的结果需要对另一个可见,那么这两个操作之间必须要存在happens-before规则注意:两个操作之间有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行。happens-before仅仅要求前一个操作的(执行的结果)对后一个操作可见。JMM的设计思想:程序员...原创 2018-08-16 19:15:04 · 1014 阅读 · 0 评论 -
Synchronized的实现原理
版本1:每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:1、如果monitor的锁计数器为0,则该线程进入monitor,然后将计数器设置为1 ,该线程即为monitor的所有者。2、如果线程已经占有该monitor,只是重新进入,则进入monitor的计数器加13....原创 2018-08-16 19:14:08 · 250 阅读 · 0 评论 -
java线程的5种状态及其转换
Java中的线程的生命周期大体可分为5种状态。1. 新建(NEW):新创建了一个线程对象。2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ...原创 2018-08-16 19:43:06 · 320 阅读 · 0 评论