synchronized实现原理 synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性 Java中每一个对象都可以作为锁: 1、静态同步方法,锁是当前类的class文件 2、普通同步方法,锁是当前对象,this 3、同步代 ...
分类:
编程语言 时间:
2018-07-31 10:59:50
阅读次数:
144
可见性的概念 一个线程对共享变量值的修改,能够及时地被其他线程看到 共享变量值:如果一个变量在多个线程的工作内存中都使用,存在副本,那么这个变量就是这几个线程的共享变量 两条重要规定: JMM(Java Memory Model) 共享变量可见性实现原理 线程1把工作内存1中更新过的共享变量刷新到主 ...
分类:
编程语言 时间:
2018-07-29 16:27:21
阅读次数:
170
上两篇文章我向大家介绍了一些线程间的基本通信方式,那么这篇文章就和大家聊聊volatile关键字的相关知识。这个关键字在我们的日常开发中很少会使用到,而在JDK的Lock包和Concurrent包下的类则大量的使用了这个关键字,因为它有如下两个特性: 1.确保内存可见性 2.禁止指令重排序 接下来就 ...
分类:
编程语言 时间:
2018-07-15 21:10:10
阅读次数:
203
1.关于volatile volatile是java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能。它主要有两重语义,一是保证多个线程对共享变量访问的可见性,二防止指令重排序。 2.语义一:内存可见性 2.1 一个例子 当你多次 ...
分类:
其他好文 时间:
2018-07-13 01:18:46
阅读次数:
257
很久没更新文章了,对隔三差五过来刷更新的读者说声抱歉。 关于 Java 并发也算是写了好几篇文章了,本文将介绍一些比较基础的内容,注意,阅读本文需要一定的并发基础。 本文的主要目的是让大家对于并发程序中的重排序、内存可见性以及原子性有一定的了解,同时要能准确理解 synchronized、volat ...
分类:
其他好文 时间:
2018-07-06 01:41:02
阅读次数:
173
一、原子性 原子性操作指相应的操作是单一不可分割的操作。例如,对int变量count执行count++d操作就不是原子性操作。因为count++实际上可以分解为3个操作:(1)读取变量count的当前值;(2)拿count的当前值和1做加法运算;(3)将加完后的值赋给count变量。 在多线程环境中 ...
分类:
编程语言 时间:
2018-07-05 14:53:37
阅读次数:
156
JVM方面 JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volatile、锁、final 垃圾回收 内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定 JVM参数及调优 Java对象模型 oop-klass、对象头 Hot ...
分类:
编程语言 时间:
2018-07-02 15:35:38
阅读次数:
206
我们已经知道同步代码块和同步方法可以保证以原子的方式执行,其实,同步还有另外一个重要概念:内存可见性。换句话说,我们不仅希望防止某个线程正在使用对象状态而另一个线程同时在修改状态,而且希望确保当一个线程修改了对象的状态后,其他线程能够看到修改后的状态。 ...
分类:
编程语言 时间:
2018-06-03 12:42:02
阅读次数:
215
我们已经知道同步代码块和同步方法可以保证以原子的方式执行,其实,同步还有另外一个重要概念:内存可见性。换句话说,我们不仅希望防止某个线程正在使用对象状态而另一个线程同时在修改状态,而且希望确保当一个线程修改了对象的状态后,其他线程能够看到修改后的状态。
分类:
编程语言 时间:
2018-05-26 11:41:18
阅读次数:
217
Java 可见性 内存模型 主存 所有线程都可以访问 本地内存 每个线程私有的内存 可见性的方法 volatile 这种方式可以保证每次取数直接从主存取 它只能保证内存的可见性,无法保证原子性 它不需要加锁,比 synchronized 更轻量级,不会阻塞线程 不会被编译器优化 然而要求对这个变量做 ...
分类:
编程语言 时间:
2018-05-21 12:21:35
阅读次数:
147