synchronized

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) {
            // 同步代码
        }
    }
}

 

posted @ 2024-08-09 17:35  zhegeMaw  阅读(27)  评论(0)    收藏  举报