java trylock lock_Java多线程:tryLock()方法

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() + "获得锁定");

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.unlock();

}

}

}

} 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(new 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()尝试获得锁,不会傻傻的等待,通过循环不停的再次尝试,如果等待的时间足够长,线程总是会获得想要的资源

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值