本文主要是介绍synchronized、volatile、lock,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转自:https://blog.csdn.net/u012102104/article/details/79231159
1、synchronized
(1)修饰方法:每次只能有一个线程进入该方法,此时线程获得的是成员锁。
public synchronized void syncMethod() {//doSomething
}
(2)修饰代码块:每次只能一个线程进入该代码,此时线程获得成员锁。
public int synMethod(int arg){synchronized(arg) {//doSomething}
}
(3)修饰对象:如果当前线程进入,那么其他线程在该类所有对象上的任何操作都不能进行,此时当前线程获得的是对象锁。
public class SyncThread implements Runnable {public static void main(String args[]) {SyncThread syncThread = new SyncThread();Thread therad1 = new Thread(syncThread, "therad1");Thread therad2 = new Thread(syncThread, "therad2");Thread therad3 = new Thread(syncThread, "therad3");therad1.start();therad2.start();therad3.start();}public void run() {synchronized (this) {System.out.println(Thread.currentThread().getName());}}
}
(4)修饰类:如果当前线程进入,那么其他线程在该类中所有操作不能进行,包括静态变量和静态方法,此时当前线程获得的是对象锁。
public class syncClass {public void method() {synchronized(syncClass.class) {//doSomething}}
}
2、volatile
volatile 关键字的作用是禁止指令的重排序,强制从公共堆栈中取得变量的值,而不是从线程私有的数据栈中取变量的值。
volatile与synchronized的区别如下:
- volatile 不会发生线程阻塞,而 synchronized 会发生线程阻塞。
- volatile 只能修饰变量,而 synchronized 可以修饰方法、代码块等。
- volatile 不能保证原子性(不能保证线程安全),而 synchronized 可以保证原子性。
- volatile 解决的是变量在多线程之间的可见性,而 synchronized 解决的是多线程之间访问资源的同步性。
3、lock
synchronized
是隐式锁,在需要同步的对象中加入此控制,而lock
是显示锁,需要显示指定起始位置和终止位置。
- 使用lock时在finally中必须释放锁,不然容易造成线程死锁;而使用synchronized时,获取锁的线程会在执行完同步代码后释放锁(或者JVM会在线程执行发生异常时释放锁)。
- 使用lock时线程不会一直等待;而使用synchronized时,假设A线程获得锁后阻塞,其他线程会一直等待。
- lock可重入、可中断、可公平也可不公平;而synchronized可重入但不可中断、非公平。
这篇关于synchronized、volatile、lock的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!