isrun java用法_Java多线程问题--方法isFair()、isHeldByCurrentThread()和isLocked()的用法和区别...

本文详细介绍了Java中ReentrantLock的isFair()、isHeldByCurrentThread()和isLocked()三个方法的用途和区别。isFair()判断锁是否为公平锁,isHeldByCurrentThread()检查当前线程是否持有锁,isLocked()则检测是否有线程持有锁。通过示例代码展示了这三个方法在公平锁和非公平锁场景下的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!

代码地址:https://github.com/xianzhixianzhixian/thread.git

方法isFair()、isHeldByCurrentThread()和isLocked()的用法和区别

1、lock.isFair()方法用来判断lock锁是公平锁还是非公平锁。公平锁是指,线程获得锁的顺序是按其等待锁的先后顺序来的,先来先获得FIFO。反之,非公平锁则是线程随机获得锁的,lock默认是非公平锁。

2、lock.isHeldByCurrentThread()的作用是查询当前线程是否保持此锁定,和lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判断当前线程是否处于等待lock的状态。

3、lock.isLocked()的作用是查询此锁定是否由任意线程保持。

方法isFair()、isHeldByCurrentThread()和isLocked()的用法示例

ServiceIsFair.java

/**

* lock.isFair()方法用来判断lock锁是公平锁还是非公平锁

* @author: xianzhixianzhixian

* @date: 2019-01-21 20:43

*/

public class ServiceIsFair {

public ReentrantLock lock;

public ServiceIsFair(Boolean isFair) {

this.lock = new ReentrantLock(isFair);

}

public void serviceMethod(){

try {

lock.lock();

System.out.println("公平锁情况:"+lock.isFair());

} finally {

lock.unlock();

}

}

}

ServiceIsHeldByCurrentThread.java

/**

* lock.isHeldByCurrentThread()的作用是查询当前线程是否保持此锁定

* 和lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判断当前线程是否处于等待lock的状态

* @author: xianzhixianzhixian

* @date: 2019-01-21 20:50

*/

public class ServiceIsHeldByCurrentThread {

private ReentrantLock lock;

public ServiceIsHeldByCurrentThread(Boolean isFair) {

this.lock = new ReentrantLock(isFair);

}

public void serviceMethod(){

try {

System.out.println("lock.isHeldByCurrentThread() "+lock.isHeldByCurrentThread());

lock.lock();

System.out.println("lock.isHeldByCurrentThread() "+lock.isHeldByCurrentThread());

} finally {

lock.unlock();

}

}

}

ServiceIsLocked.java

/**

* lock.isLocked()的作用是查询此锁定是否由任意线程保持

* @author: xianzhixianzhixian

* @date: 2019-01-21 20:54

*/

public class ServiceIsLocked {

private ReentrantLock lock;

public ServiceIsLocked(Boolean isFair) {

this.lock = new ReentrantLock(isFair);

}

public void serviceMethod(){

try {

System.out.println("lock.isLocked() "+lock.isLocked());

lock.lock();

System.out.println("lock.isLocked() "+lock.isLocked());

} finally {

lock.unlock();

}

}

}

Run.java

/**

* @author: xianzhixianzhixian

* @date: 2019-01-21 20:59

*/

public class Run {

public static void main(String[] args) throws Exception {

final ServiceIsFair serviceIsFair0 = new ServiceIsFair(true);

final ServiceIsFair serviceIsFair1 = new ServiceIsFair(false);

Runnable runnable0 = new Runnable() {

@Override

public void run() {

serviceIsFair0.serviceMethod();

}

};

Runnable runnable1 = new Runnable() {

@Override

public void run() {

serviceIsFair1.serviceMethod();

}

};

Thread thread0 = new Thread(runnable0);

thread0.start();

Thread thread1 = new Thread(runnable1);

thread1.start();

final ServiceIsHeldByCurrentThread serviceIsHeldByCurrentThread = new ServiceIsHeldByCurrentThread(true);

Runnable runnable2 = new Runnable() {

@Override

public void run() {

serviceIsHeldByCurrentThread.serviceMethod();

}

};

Thread thread2 = new Thread(runnable2);

thread2.start();

final ServiceIsLocked serviceIsLocked = new ServiceIsLocked(true);

Runnable runnable3 = new Runnable() {

@Override

public void run() {

serviceIsLocked.serviceMethod();

}

};

Thread thread3 = new Thread(runnable3);

thread3.start();

}

}

运行结果:创建了两个锁,公平锁和非公平锁,所以lock.isFair()一个为true一个为false。在lock.lock()执行之前线程未获得锁,所以lock.isHeldByCurrentThread()结果为false,执行lock.lock()之后结果为true。在lock.lock()执行之前没有线程获得锁,所以lock.lock()为false;在执行lcok.lock()之后,当前有线程已经获得了锁,所以lock.lsLocked()为true。

7694794b102c37198aca62353e043a16.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值