1.锁池 等待池
每个对象都内置了锁池跟等待池。
锁池: 某个线程拥有了该对象的锁,其他线程执行时,遇到该对象修饰的synchronized方法时,会去获取该对象锁的拥有权,由于线程A已经拥有了锁的拥有权,因此其余线程进入到该对象的锁池中。
等待池:线程A调用该对象的wait方法时,线程A会释放该对象的锁,进入该对象的等待池中。
wait方法必须在synchronized方法或者synchronized块中使用,当调用到wait方法时,该线程肯定已经获取到了锁。
wait notify使用
//JDK官方给出的使用建议
synchronized (obj) {
while (条件不满足)
obj.wait(timeout);
... // Perform action appropriate to condition
}
wait notify notifyAll 概念理解
wait nootifywait join区别理解
join:当前线程让出CPU,进入等待池中,直到子线程执行完毕。
join源码解读。
下面是Join源码,发现实际上join是通过wait实现的。
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Thread1(1),"thread1....");
Thread t2 = new Thread(new Thread2(2),"thread2....");
t1.start();
t1.join();
t2.start();
t2.join();
}
上面的可以t1.join可以认为如下,就是t1执行完之后,main继续执行,启动t2,执行完之后,继续执行main线程,知道main线程执行结束。
synchronized (t1){
while (t1.isAlive()){
t1.wait();
}
}
wait: 将当前线程挂起,并释放锁,进入等待池中。
wait sleep区别理解
sleep: sleep会让当前线程进入休眠状态,但是不会释放锁,休眠解锁会再次获取CPU资源重新运行。
网友评论