线程有四种状态:
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");
}
}
多线程状态、方法及同步注意事项
博客介绍了线程的四种状态,包括创建、就绪、阻塞和结束,还说明了线程进入阻塞状态的情况。阐述了wait和notify的使用规则,对比了sleep和wait方法对锁的处理。提及多线程并发时yield方法的作用,以及sleep、wait、join方法需异常处理。最后讲解了synchronized代码块和方法的加锁机制及互斥情况。
1032

被折叠的 条评论
为什么被折叠?



