栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java线程转储:“等待锁定”与“停放等待”之间的区别?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java线程转储:“等待锁定”与“停放等待”之间的区别?

使用内在锁时,您将在线程转储中获得“等待锁”,而使用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() { public void run() {     intrinsicLock(); }        }, "My thread");        th.start();        try { th.join();        } catch (InterruptedException e) {        }    }    void reentrantLock() {        lock.lock();        Thread th = new Thread(new Runnable() { public void run() {     reentrantLock(); }        }, "My thread");        th.start();        try { th.join();        } catch (InterruptedException e) {        }        lock.unlock();    }    public static void main(String[] args) {        LockTest lockTest = new LockTest();        lockTest.intrinsicLock();        //lockTest.reentrantLock();    }}

随着

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()
产生:

"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)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/440921.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号