1.与Monitor关联的对象不能为空
意思就是说你Synchronized() 括号中的对象不能为null
private final Object obj = null;
public void syncMethod(){
Synchronized(obj){
}
}
2.synchronized作用域太大
由于synchronized 存在排他性,如果synchronized 的作用域太大,则代表着效率非常低,甚至丧失并发的优势...
public class Task implements Runnable
{
@Override
public synchronized void run(){
}
}
synchronized 对整个逻辑单元 都加了锁,从而丧失了并发的能力
3.不同的monitor 锁相同的方法
public class Task implements Runnable
{
private final Object obj = new Object();
@Override
public void run(){
synchronized (obj){
//doSomething();
}
}
}
public static void main(String [] args){
for(int i = 0 ;;i<5i++){
new Thread(Task::new).start();
}
}
上述构造了五个线程同时也构造了五个Runnable实例,Runnable作为逻辑执行单元传递给Thread; Synchronized根本互斥不了与之对应的作用域。上述的代码每个线程争抢的monitor关联都是独立的,因此不可能起到互斥的作用。
4.多个锁交叉导致死锁
private final Object o1 = new Object();
private final Object 02 = new Object();
private void write(){
synchronized(o1){
synchronized(o2){
}
}
}
public void read(){
synchronized(o2){
synchronized(o1){
}
}
}