为什么Java锁实现中没有使用同步关键字?
为什么Java锁实现中没有使用同步关键字?,java,multithreading,synchronized,reentrantlock,Java,Multithreading,Synchronized,Reentrantlock,synchronized在Java中用于处理互斥类型的事情。但是,Java中的Lock接口(如ReentrantLock)的实现不使用此关键字。所有代码看起来都是普通代码。那么它是如何处理地球上的多个线程的呢 我相信以下代码段是相关的: final boolean acquireQueued(final Node node, int arg) { boolean failed = true; try { boolean interrupted = false;
synchronized
在Java中用于处理互斥类型的事情。但是,Java中的Lock
接口(如ReentrantLock
)的实现不使用此关键字。所有代码看起来都是普通代码。那么它是如何处理地球上的多个线程的呢
我相信以下代码段是相关的:
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
ReentrantLock的Sync
中的tryAcquire
方法
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
因此,似乎没有使用synchronized
关键字,那么它如何保证互斥呢?因为Java 1.5(?)有JVM支持使用所谓的方法进行硬件锁定。只需遵循源代码,直到调用它为止
另请参阅Doug Lea的论文以获得更好的理解:因为Java 1.5(?)有JVM支持使用所谓的方法进行硬件锁定。只需遵循源代码,直到调用它为止
另请参阅Doug Lea的论文以获得更好的理解:是。找到它并且它有本机关键字。因此,相应的代码实际上不是java?而是JVM编写的代码。对于Oracle,这是C++,对于IBM,这是java本身:-)。找到它并且它有本机关键字。因此,相应的代码实际上不是java?而是JVM编写的代码。对于Oracle,这是C++,对于IBM,这是java本身: