synchronize关键字使用方法
指定加锁对象
同步代码块,对给定对象加锁,进入同步代码块之前需要获得给定对象的锁。
synchronized ("任意类型"){
}
这个括号里加任意类型对象都可以
直接作用于实例方法
相当于给当前实例对象加锁,进入到该同步方法前需要获得该实例对象的锁。换句话说,就是想要调用该方法必须获得当前实例对象的锁才能够调用。当有多个线程操作一个实例对象调用同步方法的时候,一个线程拿到实例对象的锁,其他线程就必须排队,需要等待拿到锁的线程释放锁后才能获得,也就是锁的是当前实例对象。
public synchronized void test01{
System.out.println();
}
直接作用静态方法
相当于给当前类加锁,进入到静态同步方法前需要获得类的锁才能调用。它和普通方法锁是有区别的,synchronized作用在静态方法上,是给类加上锁,必须获得当前类的锁才可以,而普通方法锁是获得该实例对象的锁才可以。
public static synchronized void test01{
System.out.println();
}
小总结
在使用synchronized 的时候可能会存在一些错误理解。
例如,当我们两个线程或者多个线程操作两个不同的普通synchronized 方法的时候(同一个实例对象),是不可以的,需要等待第一个线程释放锁之后另一个线程才有机会获得锁然后再调用该方法。因为synchronized 直接作用在方法上,相当于对当前对象实力加锁。如果一个调用synchronized方法。另外一个调用普通方法是没有关系的,2个是不存在等待关系的。
还有一种情况是,当两个线程操作两个不同的synchronized 方法的时候(两个实例对象),各自调用这是相互不影响的,因为是不同的实例对象,不是同一把锁。