java - 显式锁与隐式锁实现

标签 java multithreading

两个示例场景:

首先:

public synchronized void foo1(){
              .....
}

public void foo2(){
              .....
}

threads 循环是:

 public void run() {
        while (true) {
           foo1();
           foo2();
        }
    }

如果我运行 10 个线程,其中一个在 foo1() 内获取锁,其他想要执行 foo1 的线程将在 foo1() 或者它们可以在 foo2 中循环并执行代码?

第二个:

public void foo1(){
      lock.lock();
      ....
      lock.unlock();
}

public void foo2(){

}

threads 循环是:

 public void run() {
        while (true) {
           foo1();
           foo2();
        }
    }

如果我运行 10 个线程,其中一个在 foo1() 中获取锁,在这种情况下,想要执行 foo1 的线程不会在 外部被阻塞foo1?

最佳答案

if i run 10 threads, and one of these acquire lock inside foo1() other threads which want to execute foo1 will wait outside foo1() or they can loop and execute code inside foo2?

假设它们在同一个对象上被调用,它们将在需要执行 foo1() 时全部排队。任何已经完成 foo1() 的那个迭代都可以执行 foo2()...但是会在下一次迭代时再次排队当他们需要执行 foo1() 时。

if i run 10 threads, and one of these acquire lock inside foo1() , in this case threads which want to execute foo1 are not blocked outside foo1?

嗯,它们不会在外部 foo1() 被阻塞,但它们会在内部 foo1().

您可能会看到示例之间的唯一区别在于堆栈跟踪。从根本上说,在这两种情况下,执行 foo1() 的主要 block 都需要线程拥有锁。

(请注意,您的 unlock 调用应该在 finally block 中。)

关于java - 显式锁与隐式锁实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26687421/

相关文章:

java - 除了放置 Time.Unit.Seconds.sleep 之外,是否还有一个线程来捕获 InterruptException?

java - Java Web 服务中使用的 url 保存在哪里?

java - 如何从给定字符串获取描述中的预期输出

java - 使用 MEME 图像等文本创建图像并保存为图像文件。使用 Canvas 在位图上绘制时无法保存图像

c++ - 为什么使用 openMP 的 VC++ 矩阵时间 vector 比异步更快?

java - 如何根据复选框状态创建标签?

c# - 干净的调用模式?

java - java.lang.Class 的用途是什么以及它与静态方法同步有何关系?

sql-server - 插入并发问题-多线程环境

java - 如何测试长时间运行的线程