Synchronizedvolatile与锁

Posted siyecho

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Synchronizedvolatile与锁相关的知识,希望对你有一定的参考价值。

时间尚早,今天多写一点

温故知新(三)

Synchronized与volatile

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

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

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

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

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

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

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



以上是关于Synchronizedvolatile与锁的主要内容,如果未能解决你的问题,请参考以下文章

并发编程之关键字(synchronizedvolatile)

多线程的常用关键字及示例代码(synchronizedvolatile)

Java 并发 -- lock vs synchronizedvolatile(保证可见性和有序性)悲观锁 vs 乐观锁

Java 并发 -- lock vs synchronizedvolatile(保证可见性和有序性)悲观锁 vs 乐观锁

Notes3并发/IO(CPU)

线程安全与锁优化