非静态的同步方法的锁对象:this
静态的同步方法的锁对象是:该类的字节码对象
this.notify():唤醒单个等待的线程
this.notifyAll():唤醒所有等待的线程
/*
* 1.在同步代码块中,用哪个对象锁,就用那个对象调用wait方法
* 2.为什么wait方法和notify方法可以定义在Object这类中
* 因为锁对象是任意对象,Object类是所有类的基类
* 3.sleep方法和wait方法的区别:
* wait方法可以传入参数(就是在参数的时间结束后等待),也可以不传入参数(直接等待),
* sleep方法在同步函数或者同步代码块中,不释放锁
* wait方法在同步函数或者同步代码块中,释放锁
*/
JDK1.5:(三个线程轮流执行)
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class DenoNotify2 {
public static void main(String[] args) {
final Print2 p=new Print2();
new Thread(){
public void run(){
while (true){
try {
p.print1();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
new Thread(){
public void run(){
while (true){
try {
p.print2();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
new Thread(){
public void run(){
while (true){
try {
p.print3();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
}
}
class Print2{
private ReentrantLock r=new ReentrantLock();
private Condition c1=r.newCondition();
private Condition c2=r.newCondition();
private Condition c3=r.newCondition();
private int flag=1;
public void print1() throws Exception{
r.lock();
if (flag!=1){
c1.await();
}
System.out.print("1");
System.out.print("2");
System.out.print("3");
System.out.print("4");
System.out.println("5");
flag=2;
c2.signal();
r.unlock();
}
public void print2() throws Exception{
r.lock();
if (flag!=2){
c2.await();
}
System.out.print("上");
System.out.print("山");
System.out.print("打");
System.out.print("老");
System.out.println("虎");
flag=3;
c3.signal();
r.unlock();
}
public void print3() throws Exception{
r.lock();
if (flag!=3){
c3.await();
}
System.out.print("a");
System.out.print("b");
System.out.print("c");
System.out.print("d");
System.out.println("e");
flag=1;
c1.signal();
r.unlock();
}
}