synchronized关键字来保证线程安全的,被sychronized锁住的代码部分,同一时刻只能有一个线程可以访问,其他线程会block(同一个对象内,不同对象间不会影响)。由于synchronized的机制是在同一时刻只能有一个线程操作,其他的线程阻塞或者轮询等待,在线程竞争激烈的情况下,这种方式的效率会非常的低下。
锁的范围
synchronized锁住的范围越小越好,类 > 方法 > 代码块。锁的对象
可以锁类、实例。1、类锁
- 锁定整个类(即Class对象)。
- 同一时间只有一个线程可以执行同步的代码块,不管有多少个实例。
public class MyClass { public void someMethod() { synchronized (MyClass.class) { // 同步代码 } } }
2、实例锁
- 锁定当前对象(即实例对象)。
- 同一时间只有一个线程可以执行同步代码块。不同实例间没有影响。
// 代码块 public class MyClass { public void someMethod() { synchronized (this) { // 注意,不能锁MyClass // 同步代码 } } } // 方法 public class MyClass { public synchronized void synchronizedInstanceMethod() { // 同步代码 } }
3、字段锁
- 锁定指定的对象实例。适用于更细粒度的控制锁。
- 同一时间只有一个线程可以执行同步的代码块。不同实例间没有影响。
public class MyClass { private final Object lock = new Object(); public void someMethod() { synchronized (lock) { // 同步代码 } } }
标签:synchronized,代码,实例,线程,MyClass,public From: https://www.cnblogs.com/zhegemaw/p/18351128