线程有四种状态:
1) 创建(new)
2) 就绪(Runnable)
3) 阻塞(Blocked)
4) 结束(Dead)
线程在以下情况下,会进入阻塞状态:
1) 调用sleep()
2) 调用wait()
3) I/O阻塞;因获取其他对象的对象锁而阻塞。
wait 和 notify的使用:
wait 和 notify的使用
1) 这两个方法都必须是在synchronized代码块或方法中使用。
2) wait一般是自己调用。而别人再进行notify()
调用sleep()的时候,锁并没有释放;而wait()方法的确释放了锁。这意味着在调用wait()期间,可以调用线程中对象的其他同步控制方法。
在多线程并发的情况下,使用yield()这个让步方法。可以让并发更加均衡。
sleep(),wait(),join()方法都必须进行try...catch,因为都有可能受interrupt所影响。
synchronized注意的地方:
synchronized代码块是对指定的对象进行加锁;synchronized方法是对本身对象进行加锁,等同于synchronized(this){}。
所以两者从机制上,没有大的区别。
注意,互斥只有在竞争者之间才会互斥;即只有争夺共享锁的之间才会互斥。
例如以下代码中,在调用sync1()的时候,同时再调用sync2(),则会互斥。而同时调用notSync()则不会互斥。
package bison.sample;
public class SynchronizedDemo {
public synchronized void sync1() {
try {
System.out.println("sync1 start sleep...");
Thread.sleep(10 * 1000);
System.out.println("sync1 end sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void sync2() {
try {
System.out.println("sync2 start sleep...");
Thread.sleep(10 * 1000);
System.out.println("sync2 end sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void notSync(){
System.out.println("notSync hello");
}
}