- 第一种:同步代码块(较为灵活,可以尽量缩小同步范围)
synchronized(线程共享对象){
同步代码块;
}
- 第二种:在实例方法上使用synchronized
此方法表示共享对象一定是当前对象this,并且同步代码块为整个方法体。(可能会扩大同步范围,降低效率,但是如果本身就是要同步整个方法,那这样写可以省代码,也是可以的)
以上两种都是找对象锁(1个对象1把锁,100个对象100把锁),若线程不是共享同一对象,则不用线程排队。
- 第三种:在静态方法上使用synchronized
表示找类锁,而类锁永远只有1把,就算创建了100个对象,类锁还是只有1把。 即使线程不是共享同一个对象,只要是同一个类,就必须线程排队。