Object 对象中的 wait()和notify()是用来实现实现等待 / 通知模式。
其中等待状态和阻塞状态是不同的。
等待状态的线程可以通过notify() 方法唤醒并继续执行,而阻塞状态的线程则是等待获取新的锁。
调用 wait()方法后,当前线程会进入等待状态,直到其他线程调用notify()或notifyAll() 来唤醒。
调用 notify() 方法后,可以唤醒正在等待的单一线程。
首先说一下synchronized的作用:保证方法或者代码块在运行时,同一时刻只有一个进程可以进行访问,同时他还可以保证共享变量的内存可见性。
其基本实现代码为:
//对于普通同步方法,锁的是当前实例对象
public class TestSyn{
private int i=0;
public synchronized void incr(){
i++;
}
}
//对于静态同步方法,锁是Class对象,也就是这一类的对象都进不来
public class TestSyn{
private int i=0;
public static synchronized void incr(){
i++;
}
}
//对于同步代码块,锁是同步代码块里的对象
public class TestSyn{
private int i=0;
Object o = new Object();
public void incr(){
synchronized(o){
i++;
}
}
}
对于同步代码块:monitorenter 指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置,
JVM需要保证每一个monitorenter都有一个monitorexit与之相对应。任何一个对象都有一个monitor与之相关联[下面三张图可以很好理解,为什么与之相关联]
当一个monitor被持有之后,它将被处于锁的状态。其他线程执行到monitorenter指令时,将尝试获取对象对应的monitor所有权,即尝试获取对象的锁。
原文:https://www.cnblogs.com/whyaza/p/12325782.html