1. Lock接口:定义了一组抽象的加锁操作,提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有的加锁和解锁的方法都是显示的。 2. ReentrantLock锁:实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性,也提供了可重入的加锁语义。finally后 ...
分类:
其他好文 时间:
2017-05-06 14:12:38
阅读次数:
194
内存可见性volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。为了能比..
分类:
编程语言 时间:
2017-04-14 21:32:51
阅读次数:
304
happens-before:描述内存可见性as-if-serial:无论怎么重排序,程序的运行结果不会改变 ReentrantLock依赖了队列同步器AQS,其实现方式是volatile变量的读写操作进行线程间通信,通过CAS修改state值,成功,其state值>0,则取锁成功 Concurre ...
分类:
Web程序 时间:
2017-03-29 16:26:45
阅读次数:
249
内存可见性(Memory Visibility) 1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象 状态后,其他线程能够看到发生的状态变化。 2 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确 ...
分类:
编程语言 时间:
2017-03-19 17:03:17
阅读次数:
181
前言 首先,我们使用多线程的目的在于提高程序的效率,但是如果使用不当,不仅不能提高效率,反而会使程序的性能更低,因为多线程涉及到线程之间的调度、CPU上下文的切换以及包括线程的创建、销毁和同步等等,开销比单线程大,因此需谨慎使用多线程。 在jdk1.5以后,提供了一个强大的java.util.cur ...
分类:
其他好文 时间:
2017-02-13 08:39:25
阅读次数:
146
我们都知道 volatile这个关键字,使用它在多线程环境下能保证该变量的内存可见性;这是如何实现的呢?Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声 ...
分类:
其他好文 时间:
2017-02-09 18:46:09
阅读次数:
172
先看一段代码: 运行这段代码,运行的结果只有: flag= true 这是由于 子线程在操作共享数据时,会将主存总的flag,复制一份到线程的缓存中进行操作,操作完成后会再将数据写到主存中,由于while(true)是一个运行效率非常高的一句代码,而且运行速度非常快,导致主线程再执行循环时没有机会从 ...
分类:
其他好文 时间:
2017-01-22 22:48:52
阅读次数:
217
有如下说法(Synchronized的内存可见性) 导致共享数据出错的两个问题:重排序;共享数据及时更新。 1.进程和线程 进程:系统调度程序的过程。每个进程有自己内存空间 线程:在进程中程序的执行路径。cup的最小执行单位。只能cup为线程分配一些属于进程的内存空间。 2.线程创建的2种方式:继承 ...
分类:
编程语言 时间:
2016-12-27 22:36:41
阅读次数:
179
1、volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。 2、从内存可见性的角度看,写入volatile变量相当于退出同步代码块,而读取volatile变量 ...
分类:
编程语言 时间:
2016-12-22 11:53:41
阅读次数:
186
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性。我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态, ...
分类:
编程语言 时间:
2016-12-22 10:47:53
阅读次数:
147