如果锁本身引起争议会发生什么?

时间:2013-12-30 04:41:12

标签: java multithreading locking

Java中的所有对象都有内部锁,这些锁用于同步。这个概念可以防止对象被不同的线程同时操纵,或者帮助控制特定代码块的执行。

如果锁本身受到争议会发生什么 - 即2个线程要求锁定在精确的微秒。

谁得到了它,它是如何得到解决的?

4 个答案:

答案 0 :(得分:3)

  

如果锁本身受到争议会发生什么 - 即2个线程要求锁定在精确的微秒。

一个线程将获得锁定,另一个线程将被阻塞,直到第一个线程释放它为止。

(旁白:其他一些答案声称在Java中没有“同时”这样的东西。他们错了!!有这样的事情!如果JVM使用两个或更多多核系统的核心,然后不同核心上的两个线程可以中完全请求相同的对象锁定相同的硬件时钟周期。显然,只有一个会得到它,但这是一个不同的问题。)

  

谁得到了它,它是如何得到解决的?

没有指定哪个线程会获得锁定。

它(通常)由OS'es线程调度程序解决...使用任何使用的机制。 JVM行为的这一方面(显然)是特定于平台的。

如果你真的想要确切地知道发生了什么,那么OpenJDK和Linux的源代码是免费提供的。但坦率地说,你不需要知道

答案 1 :(得分:1)

在并发方面,没有“同时”这样的东西; java确保某人是第一位的。

如果你问同时对锁定对象的争用访问,那就是并发编程的本质 - 没有什么可说的,只是“它发生在设计上”

如果您要求同时将对象用作锁作为常规对象,则不会出现问题:在并发调用同步期间使用非同步方法时会一直发生这种情况方法(使用this作为锁定对象)

答案 2 :(得分:1)

处理锁定请求的事物一次只能处理一件事;因此,2个线程不能同时请求锁定。

即使它在相同的微秒内,一个仍将领先于另一个(可能更快一纳秒)。首先要求的人将获得锁定。那个问第二个的人将等待释放锁。

类比将...将纸叠在一起......假设我有一只手,那只手只能拿一张纸。不同的人(线程)递给我一张纸。如果两个人“同时向我提供论文”,我会先处理一个

实际上,没有同时存在这样的事情。这句话的存在是因为我们的大脑无法在微纳米......微微秒速度下工作

http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

答案 3 :(得分:1)

锁不仅在JVM中实现,而且在OS和硬件级别实现,因此机制可能不同。我们依赖于Java API和JVM规范,并且他们说其中一个线程将获取另一个将阻止的锁。