class Maintest {
public static void main(String args[]) throws Exception {
ThreadDemo thr = new ThreadDemo();
thr.start();
for (int i = 1; i < 1000; i++) {
synchronized (Maintest.class) { //Maintest.class是什么意思,非常不明白
System.out.println("main: " + i);
Maintest.class.notify(); //这个与下边怎么联系?
Maintest.class.wait();
}
} }
}class ThreadDemo extends Thread {
public void run() {
for (int i = 1; i < 1000; i++) {
try {
synchronized (Maintest.class) { System.out.println(this.getName() + ":" + i);
Maintest.class.notify();
Maintest.class.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String args[]) throws Exception {
ThreadDemo thr = new ThreadDemo();
thr.start();
for (int i = 1; i < 1000; i++) {
synchronized (Maintest.class) { //Maintest.class是什么意思,非常不明白
System.out.println("main: " + i);
Maintest.class.notify(); //这个与下边怎么联系?
Maintest.class.wait();
}
} }
}class ThreadDemo extends Thread {
public void run() {
for (int i = 1; i < 1000; i++) {
try {
synchronized (Maintest.class) { System.out.println(this.getName() + ":" + i);
Maintest.class.notify();
Maintest.class.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
wait的时候会释放该对象锁,通过这个对象wait的线程在该对象调用notify的时候会被唤醒不知道说明白了没有
他是用来生成对class对象的引用 说白了Maintest.class在这里就是一个锁 就跟用String "aaa" 或者this一样
synchronized(o){} o.notify(); o.wait(); 这个3个东西用同一个锁所以就需要
synchronized (Maintest.class) {
System.out.println("main: " + i);
Maintest.class.notify();
}而你可以注意到在2个线程中的synchronized代码块用的锁是同一个就是Maintest.class这个对象的引用然后代码也可以这样写(换一个锁) 效果一样
public class MainTest {
public static void main(String args[]) throws Exception {
Lock lock = new Lock();
ThreadDemo thr = new ThreadDemo(lock);
thr.start();
for (int i = 1; i < 1000; i++) {
synchronized (lock) {
System.out.println("main: " + i);
lock.notify();
lock.wait();
}
} }
}class ThreadDemo extends Thread {
Lock lock;
public ThreadDemo(Lock lock){this.lock = lock;}
public void run() {
for (int i = 1; i < 1000; i++) {
try {
synchronized (lock) {
System.out.println(this.getName() + ":" + i);
lock.notify();
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}class Lock{}
进屋后,有人wait就是关门,睡觉
有人notify就是开门先开门在睡觉
lock.notify();
lock.wait();
关门的时机是wait这行代码执行结束
开门的时机是synchronized {}结束,或者执行wait
代码块结束了就是人从屋子里面出来了
只有一种情况屋子里面会有两个人
就是第一个人睡觉了,第二个人才可以进去,刚才讲了,wait也是可以开门的不同的锁可以理解为同一个屋子的 镜像,他们彼此是隔离的
就是锁同一个代码块可以是不同的锁,虽然是同一个代码块,但是一定要把不同的锁当成不通的屋子为什么锁会不同,这个很简单了
synchronized (变量)
是变量当然就会不同了,不知道例子举得好不好,明白了吗?
那个Maintest.class可以随便更换为一对象,同一对象只有一把对应的锁
利用该对象锁来进行 wait与notify,
其实一般的问题比这要复杂,通常有多个不同的线程挂在一把锁上~
不说了~感觉一说就象打开自己记忆一样,停不下来`~
http://topic.csdn.net/u/20081004/09/19666f3a-9f12-4f4f-8740-04beb65009da.html
参8楼