大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
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的使用方法。。求大神解释。。谢谢~~
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181422.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...