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的使用方法。。求大神解释。。谢谢~~
今天的文章java lock synchronized_Java substring分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/77903.html