线程通信
除了使用synchronized来对代码块和方法进行同步外,jdk1.5之后还有一种Lock同步锁的方式进行同步
使用lock.lock()来进行加锁,使用lock.unlock()方法来释放锁
既然可以使用lock来代替synchronized,那么如何进行实现synchronized与wait()、notify()、notifyAll()的线程通信机制呢
在使用lock时使用Condition来进行线程通信
cpu在执行代码的时候,为了减少变量访问的时间消耗可能会将代码中访问的变量值缓存到该CPU的缓存区,所以在相应代码再次访问某个变量时,读到的值可能来自于缓存区而不是主存,同样,代码对这些缓存过的变量值的修改也可能只是被写入到缓存区,而没有回写到主存,且每个CPU都有自己的缓存区,因此一个CPU缓存区中的内容对于其他CPU是不可见的
可见性就是一个线程对于共享变量的修改能够及时的被其他线程看到
共享变量是指如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量
在java规范中指出:为了获得更快的速度,允许线程保存共享变量的私有拷贝,而且只有在线程进入或者离开同步代码块时才会将私有拷贝与共享内存中的原始值进行比较
可见性的实现方式
先举一个例子,来看一下不使用volatile的时候
1 | public class TestVolatile { |