2011-02-12 150 views
3

假设我有下面的代码段多线程与线程占先同步

public synchronized void method() 
{ 
    if(something == null) 
    { 
     something = new SomeThing(); 
    } 
    //do something 
} 

现在,在多线程环境中假设,一个线程[线程1]进入方法,它执行后只是抢占new Something();但然后才能将其分配给something。然后另一个线程[线程2]也尝试调用该方法。现在究竟发生了什么?线程1获得的锁定会发生什么?线程1的步骤是否会回滚?

+0

同步不是一个事务,没有办法滚回来。如果在该块中删除了文件或发送了UDP数据报,您将如何回滚? – 2011-02-12 06:42:05

回答

7

线程1并没有放弃锁定,所以它仍然拥有它。当线程2准备采取锁定时,它会发现它必须等待并输入BLOCKED状态。下一次操作系统调度Thread1时,它将完成执行并释放锁。这使Thread2可以再次调度。

3

线程2将不能进入该方法,直到线程1退出,因为它是同步的。

最终,调度程序将绕过继续使用线程1,线程1将执行新的Something()并退出该方法。然后,线程2将能够通过构造新的Something()来输入函数。

锁的整个想法是,线程1不会丢失它,直到完成它。线程1在退出方法()时解锁,然后线程2能够获取它。

+1

虽然有一种方法可以暂时“失去”同步块中的锁。调用`Object.wait()`。 – 2011-02-12 06:40:39