这两天补了下多线程的东西,看了看书,看了看大牛们写的,有了写粗浅的理解,现在自己总结下
synchronized有两种用法,同步方法和同步代码块
总结如下:
1、当一个线程通过A对象访问一个非静态的同步方法(或同步代码块)时,其他线程通过A对象访问非静态同步方法(或同步代码块)的操作都会被锁定。但是其他线程通过A对象访问非静态非同步方法的操作不会被锁定,而且通过B对象访问非静态同步方法的操作也不会被锁。(因为各个对象的锁是独立的所以叫做对象锁)
2、当一个线程访问静态同步方法或者由类锁修饰的同步代码块时,所有该类的静态方法或者被同一个类锁修饰的同步代码块都会被锁定,其他线程无法访问。
3、类锁和对象锁互不影响。
4、修饰方法和修饰代码块在本质上是一样的,区别只在于修饰代码块的方式在竞争激烈的情况下更加高效。
5、注意区别以下代码的对象锁的持有情况
public class Human {
//XiaoMing.eatDinner();
public synchronized void eatDinner() { //这里的锁是XiaoMing
pickupByLeftHand();
eatFoodByMouth();
};
//XiaoMing.eatDinner2();
public void eatDinner() {
synchronized(this) { //这里的锁是XiaoMing
pickupByLeftHand();
eatFoodByMouth();
}
};
//XiaoMing.drinkWater();
public void drinkWater() {
pickupByRightHand();
synchronized (mouth) { //这里的锁是mouth
drinkWaterByMouth();
}
}
}
参考资料:https://blog.csdn.net/luoweifu/article/details/46613015
https://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
https://www.jianshu.com/p/9abdf1de5d40