Java线程内部

标签 java multithreading locking semaphore synchronized

我研究 Java 的内部结构已经有一段时间了。我很想学习和理解线程/锁定在 Java 中是如何发生的。

因此,为了访问同步方法或同步块(synchronized block),线程必须首先获取对象上的锁。所以,现在,我需要更多的光线。

那么,每当线程获取对象的锁时,它是否会在内部增加信号量的值? 如果答案是肯定的,那么让我们来看看这个场景。

class ABC{ 

    public void method_1(){
        synchronized(xyz){
            ....
        }
    }

    public void method_2(){
        ...
        synchronized(xyz){
            ....
        }
    }
}

假设有两个线程:线程 1 和线程 2。假设,线程 1 首先进入 method_1,因此首先获得了对 xyz 的锁定。并且,现在说,Thread2 进入 method_2 并尝试获取对 xyz 的锁定。会发生什么? (据我所知,Thread2 会被阻塞,因为它发现对象的信号量值>0)

让我知道我的推理是否正确。

最佳答案

whenever the thread acquires the lock on the object, does it increment the value of the semaphore internally?

特定于实现,但不太可能,因为每个锁只能获得一次,因此不需要计数器。一个简单的切换就可以了。我假设每个锁都持有对拥有它的线程的引用(或 null)。

更新:实际上,它比这要复杂得多。锁还需要维护一个等待它的线程列表。此外,线程可以通过等待/通知机制临时释放锁(所以毕竟会有一个入口计数器)。最重要的是,锁管理对性能有很大影响,因此正在进行各种优化。我找到了这个 interesting blog由从事 JVM 锁定工作的人编写。

So, say there are two threads: Threaad 1 and Thread 2. Assuming, Thread1 entered method_1 first and therefore acquired a lock on xyz first. And, say now, Thread2 enters method_2 and tries to acquire lock on xyz. What will happen?

是的,线程2会被阻塞,一直等到它最终能拿到锁。

关于Java线程内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2305033/

相关文章:

.net - 线程安全对象 - 静态还是非静态?

java android : res\drawable-hdpi\Restaurant-Blue-2-icon. png : Invalid file name: must contain only [a-z0-9_.],无法修复

java - 无法调用 Pokemon 类中的对象

php - PDO、mysql、事务和表锁定

java - 如何检查线程时序?

java - 上下文切换是否会导致高 CPU

ios - 在 Objective-C 中锁定一个实例变量

java - 创建 Android 应用程序的 PHP 后端

java - PriorityQueue 元素未排序

c++ - C++ 类中线程的函数