Synchronized、volatile与锁

时间尚早,今天多写一点

温故知新(三)

Synchronized与volatile

Synchronized有以下两个含义:
一、一次只有一个线程可以执行代码的受保护部分
二、一个线程更改的数据对于其他线程是可见的

volatile只适合于控制对基本变量(int、boolean等)的单个实例的访问。当一个变量被声明为volatile,任何对该变量的写操作都会绕过高速缓存,直接写入主内存,而任何对改变量的读取也都绕过高速缓存,直接取自主内存。这表示所有线程在任何时候看到的volatile变量值都相同。

每个Java对象都有一个相关的锁,同一时间只能有一个线程持有Java锁。当线程进入Synchronized代码块时,线程会阻塞并等待,直到锁可用。当线程处于就绪状态时,并且获得锁后,将执行代码块。当控制退出受保护的代码块,即到达了代码块末尾或者抛出没有在Synchronized块中捕获的异常时,它就会释放该锁。

Java锁可以保护许多代码块或方法,每次只有一个线程可以持有锁。反之,仅仅因为代码块有锁保护并不表示两个线程不能同时执行该代码块。它只表示如果两个线程正在等待相同的锁,则它们不能同时执行该代码。

将方法声明成Synchronized,这表示在进入方法主体之前,调用者必须获得锁。对于普通的Synchronized方法,这个锁是一个对象,将针对它调用方法。对于静态的Synchronized方法,这个锁是与Class对象相关的监控器,在该对象中声明了方法。

使用this引用作为锁(Synchronized(this),块同步),表示该代码块将与这个类中的Synchronized方法使用同一个锁。

访问基于堆栈的局部变量从来不需要受到保护,因为它们只能被自己所属的线程访问。

猜你喜欢

转载自www.cnblogs.com/siyecho/p/9446564.html