sách gpt4 ăn đã đi

Java 线程转储: Sự khác biệt giữa "chờ khóa" và "đỗ xe để chờ"?

In lại Tác giả: IT Lão Cao 更新时间:2023-10-28 20:44:21 27 4
mua khóa gpt4 giày nike

在 Java 线程转储中,您可以看到堆栈跟踪中提到的锁。
似乎有三种信息:

1:

- locked <0x00002aab329f7fa0> (a java.io.BufferedInputStream)

2:

- waiting to lock <0x00002aaaf4ff6fa0> (a org.alfresco.repo.lock.LockServiceImpl)

3:

- parking to wait for <0x00002aaafbf70bb8> (a java.util.concurrent.SynchronousQueue$TransferStack)
  • 1:线程已获得对象 0x00002aab329f7fa0 的锁定。
  • 2&3: 好像是说线程正在等待所述对象上的锁变为可用...
    但是 2 和 3 有什么区别?

câu trả lời hay nhất

在使用内部锁时,您将在线程转储中获得“等待锁定”,而在使用来自 java.util.concurrent 的锁时,您将获得“等待锁定”。考虑以下示例:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {

final Lock lock = new ReentrantLock(true);

synchronized void intrinsicLock() {
Thread th = new Thread(new Runnable() {
công khai void run() {
intrinsicLock();
}
}, "My thread");
th.start();
thử {
th.join();
} bắt (InterruptedException e) {
}
}

void reentrantLock() {
khóa.khóa();
Thread th = new Thread(new Runnable() {
công khai void run() {
reentrantLock();
}
}, "My thread");
th.start();
thử {
th.join();
} bắt (InterruptedException e) {
}
khóa.mở khóa();
}


public static void main(String[] args) {
LockTest lockTest = new LockTest();
lockTest.intrinsicLock();
//lockTest.reentrantLock();
}

}

sử dụng lockTest.intrinsicLock() 你会得到以下线程转储:

"My thread" prio=10 tid=0x00007fffec015800 nid=0x1775 waiting for monitor entry [0x00007ffff15e5000]
java.lang.Thread.State: BLOCKED (on object monitor)
at LockTest.intrinsicLock(LockTest.java:9)
- waiting to lock <0x00000007d6a33b10> (a LockTest)
at LockTest$1.run(LockTest.java:11)
at java.lang.Thread.run(Thread.java:662)

lockTest.reentrantLock() sản xuất:

"My thread" prio=10 tid=0x00007fffec082800 nid=0x17e8 waiting on condition [0x00007ffff14eb000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007d6a33d30> (a java.util.concurrent.locks.ReentrantLock$FairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
at java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:201)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
at LockTest.reentrantLock(LockTest.java:22)
at LockTest$2.run(LockTest.java:25)
at java.lang.Thread.run(Thread.java:662)

关于Java 线程转储 : Difference between "waiting to lock" and "parking to wait for"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11337384/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress