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(){ } 
}

当下面的情况发生时,可能会出现死锁

  1. 有多个共享资源
  2. 线程锁定了一个共享资源,但还没有解除锁定就锁定了另外一个共享资源
  3. 各个线程获取共享资源的顺序不固定

也就是说,打破上面的三个情况的任何一个,就可以避免死锁的发生。 参考: 《Java多线程设计模式》,中国铁道出版社,2005,结城浩


文章来源:http://localhost/wp2/?p=70