详解Java多线程tryLock()方法使用

网友投稿 455 2022-09-19


详解Java多线程tryLock()方法使用

tryLock(long time, TimeUnit unit) 的作用在给定等待时长内锁没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时等待。

package com.wkcto.lock.reentrant;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.ReentrantLock;

/**

*tryLock(long time, TimeUnit unit) 的基本使用

*/

public class Test07 {

static class TimeLock implements Runnable{

private static ReentrantLock lock = new ReentrantLock(); //定义锁对象

@Override

public void run() {

try {

if ( lock.tryLock(3, TimeUnit.SECONDS) ){ //获得锁返回true

System.out.println(Thread.currentThread().getName() + "获得锁,执行耗时任务");

// Thread.sleep(4000); //假设Thread-0线程先持有锁,完成任务需要4秒钟,Thread-1线程尝试获得锁,Thread-1线程在3秒内还没有获得锁的话,Thread-1线程会放弃

Thread.sleep(2000); //假设Thread-0线程先持有锁,完成任务需要2秒钟,Thread-1线程尝试获得锁,Thread-1线程会一直尝试,在它约定尝试的3秒内可以获得锁对象

}else { //没有获得锁

System.out.println(Thread.currentThread().getName() + "没有获得锁");

}

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

if (lock.isHeldByCurrentThread()){

lock.unlock();

}

}

}

}

public static void main(String[] args) {

TimeLock timeLock = new TimeLock();

Thread t1 = new Thread(timeLock);

Thread t2 = new Thread(timeLock);

t1.start();

t2.start();

}

}

tryLock()仅在调用时锁定未被其他线程持有的锁,如果调用方法时,锁对象对其他线程持有,则放弃,调用方法尝试获得没,如果该锁没有被其他线程占用则返回true表示锁定成功; 如果锁被其他线程占用则返回false,不等待。

package com.wkcto.lock.reentrant;

import java.util.concurrent.locks.ReentrantLock;

/**

*tryLock()

* 当锁对象没有被其他线程持有的情况下才会获得该锁定

*/

public class Test08 {

static class Service{

private ReentrantLock lock = new ReentrantLock();

public void serviceMethod(){

try {

if (lock.tryLock()){

System.out.println(Thread.currentThread().getName() + "获得锁定");

SoLRwx Thread.sleep(3000); //模拟执行任务的时长

}else {

System.out.println(Thread.currentThread().getName() + "没有获得锁定");

}

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

if (lock.isHeldByCurrentThread()){

lock.unlock();

}

}

}

}

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

Service service = new Service();

Runnable r = new Runnable() {

@Override

public void run() {

service.serviceMethod();

}

};

Thread t1 = new Thread(r);

t1.start();

Thread.sleep(50); //睡眠50毫秒,确保t1线程锁定

Thread t2 = new Thread(r);

t2.start();

}

}

package com.wkcto.lock.reentrant;

import java.util.Random;

import java.util.concurrent.locks.ReentrantLock;

/**

* 使用tryLock()可以避免死锁

*/

public class Test09 {

static class IntLock implements Runnable{

private static ReentrantLock lock1 = new ReentrantLock();

private static ReentrantLock lock2 = new ReentrantLock();

private int lockNum; //用于控制锁的顺序

public IntLock(int lockNum) {

this.lockNum = lockNum;

}

@Override

public void run() {

if ( lockNum % 2 == 0 ){ //偶数先锁1,再锁2

while (true){

try {

if (lock1.tryLock()){

System.out.println(Thread.currentThread().getName() + "获得锁1, 还想获得锁2");

Thread.sleep(new Random().nextInt(100));

try {

if (lock2.tryLock()){

System.out.println(Thread.currentThread().getName() + "同时获得锁1与锁2 ----完成任务了");

return; //结束run()方法执行,即当前线程结束

}

} finally {

if (lock2.isHeldByCurrentThread()){

lock2.unSoLRwxlock();

}

}

}

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

if (lock1.isHeldByCurrentThread()){

lock1.unlock();

}

}

}

}else { //奇数就先锁2,再锁1

while (true){

try {

if (lock2.tryLock()){

System.out.println(Thread.currentThread().getName() + "获得锁2, 还想获得锁1");

Thread.sleep(SoLRwxnew Random().nextInt(100));

try {

if (lock1.tryLock()){

System.out.println(Thread.currentThread().getName() + "同时获得锁1与锁2 ----完成任务了");

return; //结束run()方法执行,即当前线程结束

}

} finally {

if (lock1.isHeldByCurrentThread()){

lock1.unlock();

}

}

}

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

if (lock2.isHeldByCurrentThread()){

lock2.unlock();

}

}

}

}

}

}

public static void main(String[] args) {

IntLock intLock1 = new IntLock(11);

IntLock intLock2 = new IntLock(22);

Thread t1 = new Thread(intLock1);

Thread t2 = new Thread(intLock2);

t1.start();

t2.start();

//运行后,使用tryLock()尝试获得锁,不会傻傻的等待,通过循环不停的再次尝试,如果等待的时间足够长,线程总是会获得想要的资源

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MPLS的产生、工作原理、路由器和数据报文结构(mpls网络结构示意图)
下一篇:BGP配置邻居、多跳、同步、路由汇总、RR、联盟(bgp动态路由)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~