如何判断当前线程是否持有锁

2025-10-05 10:52:41

1、第一步:实现思路。

1、要实现此次功能的测试我们需要借助于java.lang.Thread中有一个方法叫holdsLock(),它是一个由native修饰的非java代码实现的方法。

2、java的native关键字标示一个方法就是一个java调用非java代码的接口。如下图所示。

3、借助于Object类的wait()方法,wait抛出IllegalMonitorStateException异常,表示当前的线程没有获得对象的锁。

如何判断当前线程是否持有锁

2、第二步:holdsLock()代码实现。

第一种借助于holdsLock()方法代码如下所示:

public static void main(String[] args) {    try {       new ThreadTest().testHoldsLock();    }catch (Exception e) {        e.printStackTrace();    }}//它返回true表示当且仅当当前线程拥有某个具体对象的锁public void testHoldsLock() throws Exception {    Object object = new Object();    new Thread(new Runnable() {        @Override        public void run() {            synchronized(object) {                System.out.println(Thread.currentThread().getName()+"有锁: " +                        Thread.holdsLock(object));            }        }    }).start();    System.out.println(Thread.currentThread().getName()+"无锁: " + Thread.holdsLock(object));    Thread.sleep(2000);}

如何判断当前线程是否持有锁

如何判断当前线程是否持有锁

如何判断当前线程是否持有锁

3、第三步:wait代码实现。

第二种具体实现代码如下所示:

public static void main(String[] args) {    try {       new ThreadTest().testWait();    }catch (Exception e) {        e.printStackTrace();    }}public void testWait() throws Exception {    Object object = new Object();    new Thread(new Runnable() {        @Override        public void run() {            synchronized(object) {                try {                    object.wait(10);                    System.out.println(Thread.currentThread().getName()+"有锁");                } catch (InterruptedException e) {                    System.out.println(Thread.currentThread().getName() +"无锁");                }            }        }    }).start();    try {        object.wait();        System.out.println(Thread.currentThread().getName() +"有锁");    } catch (IllegalMonitorStateException e) {        System.out.println(Thread.currentThread().getName() +"无锁");    }    Thread.sleep(2000);}

如何判断当前线程是否持有锁

如何判断当前线程是否持有锁

如何判断当前线程是否持有锁

如何判断当前线程是否持有锁

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢