【问题标题】:Multithreading and Synchronization with Thread preemption多线程和线程抢占同步
【发布时间】:2011-02-12 05:09:05
【问题描述】:

假设我有以下代码

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

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

【问题讨论】:

  • 同步不像事务,没有办法回滚。如果在该块中删除了文件或发送了 UDP 数据报,您将如何回滚?

标签: java multithreading synchronization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    最终调度程序将继续处理线程 1,线程 1 将执行 new Something() 并退出该方法。然后,线程 2 将能够进入构造了 new Something() 的函数。

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

    【讨论】:

    • 有一种方法可以暂时“丢失”同步块中的锁。致电Object.wait()
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    相关资源
    最近更新 更多