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 乐观锁