欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

如何在Java中实际运用tryLock()和lock()方法: 一次解读tryLock_lock.tryLock方法的实践指南

最编程 2024-07-28 18:53:14
...

package concurrent;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class TestTryLock {

private List list = new ArrayList();

private Lock lock = new ReentrantLock();

public static void main(String[] args) {

final TestTryLock test = new TestTryLock();

new Thread(“第一个线程 “) {

@Override

public void run() {

test.doSomething(Thread.currentThread());

}

}.start();

new Thread(“第二个线程 “) {

@Override

public void run() {

test.doSomething(Thread.currentThread());

}

}.start();

}

public void doSomething(Thread thread) {

if (lock.tryLock()) {

try {

System.out.println(thread.getName() + “得到了锁.”);

for (int i = 0; i < 10; i++) {

list.add(i);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

System.out.println(thread.getName() + “释放了锁.”);

lock.unlock();

}

} else {

System.out.println(thread.getName() + “获取锁失败.”);

}

}

}

以上代码运行结果如下:

第一个线程 得到了锁.

第一个线程 释放了锁.

第二个线程 得到了锁.

第二个线程 释放了锁.

package concurrent;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class TestTryLock {

private List list = new ArrayList();

private Lock lock = new ReentrantLock();

public static void main(String[] args) {

final TestTryLock test = new TestTryLock();

new Thread(“第一个线程 “) {

@Override

public void run() {

test.doSomething(Thread.currentThread());

}

}.start();

new Thread(“第二个线程 “) {

@Override

public void run() {

test.doSomething(Thread.currentThread());

}

}.start();

}

public void doSomething(Thread thread) {

if (lock.tryLock()) {

try {

System.out.println(thread.getName() + “得到了锁.”);

for (int i = 0; i < 10; i++) {

list.add(i);

Thread.sleep(10);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

System.out.println(thread.getName() + “释放了锁.”);

lock.unlock();

}

} else {

System.out.println(thread.getName() + “获取锁失败.”);

}

}

}

运行结果如下:

第二个线程 得到了锁.

第一个线程 获取锁失败.

第二个线程 释放了锁.

问题如下:

我知道lock()方法去获取锁,当获取不到锁的时候,会一直等待。直到获取到锁。

tryLock()方法获取锁的时候,制作一次试探,如果获取锁失败,就不会一直等待的。如果是这样的话,如我Demo所示的这样,在业务逻辑中使用tryLock很容易造成程序不可控。比较疑惑这个tryLock的使用方法。。求大神解释。。谢谢~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。