Single Threaded Execution模式的核心就是single,即某个共享资源同时只能被某一个线程访问。可以做如下比喻来理解这个模式:门(共享资源),人(线程)。一个门一次只能由一个人通过。如果一个人正在通过这个门,那么其他人只能等待了。 当然,共享资源中某些方法是线程安全的(SafeMethod),就不用考虑多个线程同时调用的情况了。只有对不安全的方法(UnsafeMethod)才需要考虑多线程访问的问题。 可以对Single Thread Execution模式这样理解:如果另外的线程也行执行被保护的UnsafeMethod,那么就需要判断是否有其他线程正在执行被保护的UnsafeMethod。如果有,则等待;没有,则执行。 对Single Threaded Execution Pattern来说,代码的典型表现形式就是对所有的UnsafeMethod方法加上synchronized关键字。如:
class A{
public void safeMethod(){ }
public synchronized void unsafeMethod1(){ }
publi synchronized void unsafeMethod2(){ }
}
当下面的情况发生时,可能会出现死锁
- 有多个共享资源
- 线程锁定了一个共享资源,但还没有解除锁定就锁定了另外一个共享资源
- 各个线程获取共享资源的顺序不固定
也就是说,打破上面的三个情况的任何一个,就可以避免死锁的发生。 参考: 《Java多线程设计模式》,中国铁道出版社,2005,结城浩
文章来源:
http://localhost/wp2/?p=70