Synchronized、volatile与锁
时间尚早,今天多写一点
温故知新(三)
Synchronized与volatile
Synchronized有以下两个含义:
一、一次只有一个线程可以执行代码的受保护部分
二、一个线程更改的数据对于其他线程是可见的
volatile只适合于控制对基本变量(int、boolean等)的单个实例的访问。当一个变量被声明为volatile,任何对该变量的写操作都会绕过高速缓存,直接写入主内存,而任何对改变量的读取也都绕过高速缓存,直接取自主内存。这表示所有线程在任何时候看到的volatile变量值都相同。
锁
每个Java对象都有一个相关的锁,同一时间只能有一个线程持有Java锁。当线程进入Synchronized代码块时,线程会阻塞并等待,直到锁可用。当线程处于就绪状态时,并且获得锁后,将执行代码块。当控制退出受保护的代码块,即到达了代码块末尾或者抛出没有在Synchronized块中捕获的异常时,它就会释放该锁。
Java锁可以保护许多代码块或方法,每次只有一个线程可以持有锁。反之,仅仅因为代码块有锁保护并不表示两个线程不能同时执行该代码块。它只表示如果两个线程正在等待相同的锁,则它们不能同时执行该代码。
将方法声明成Synchronized,这表示在进入方法主体之前,调用者必须获得锁。对于普通的Synchronized方法,这个锁是一个对象,将针对它调用方法。对于静态的Synchronized方法,这个锁是与Class对象相关的监控器,在该对象中声明了方法。
使用this引用作为锁(Synchronized(this),块同步),表示该代码块将与这个类中的Synchronized方法使用同一个锁。
访问基于堆栈的局部变量从来不需要受到保护,因为它们只能被自己所属的线程访问。