synchronized
实现线程同步,在多个线程争抢一个资源的时候保证只有一个线程能获取资源,保证数据不会出错。
synchronized
到底锁的是什么?
修饰方法
静态方法(类方法)
给静态方法添加 synchronized
关键字后,该类的被 synchronized
标识的静态方法一次只能被一个线程调用(获得锁),调用期间(占用锁)其它线程不允许调用被 synchronized
标识的静态方法(未获得锁),而没有添加 synchronized
关键字的静态方法(没有锁)可以被多个线程随时随意调用。
非静态方法
给非静态方法添加 synchronized
关键字后,该类的实例对象的被 synchronized
标识的非静态方法一次只能被一个线程调用(获得锁),调用期间(占用锁)其它线程不允许调用被 synchronized
标识的非静态方法(未获得锁),而没有添加 synchronized
关键字的非静态方法(没有锁)可以被多个线程随时随意调用。
修饰代码块
public void func() {
// Do something
synchronized (Object) {
// Do something
}
// Do something
}
被 synchronized
修饰的代码块锁的是传入的 Object
对象,当一个线程获得此锁后,在执行被修饰代码块的过程中,其它线程无法执行该代码块,待获得锁后才能执行该代码块。
以上仅为个人学习总结,欢迎交流指正。