-
trylock
2014-09-01 10:07:37[code="c++"] #include #include using namespace std; pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; ... int ret = pthread_mutex_trylock(&g_mutex); cout
#include <pthread.h>
#include <iostream>
using namespace std;
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
void testLock()
{
int ret = pthread_mutex_trylock(&g_mutex);
cout << "try lock:" << ret << endl;
ret = pthread_mutex_unlock(&g_mutex);
cout << "unlock:" << ret << endl;
}
int main()
{
testLock();
cout << "---------test lock twice---------" << endl;
pthread_mutex_lock(&g_mutex);
testLock();
pthread_mutex_unlock(&g_mutex);
}
try lock:0
unlock:0
---------test lock twice---------
try lock:16
unlock:0 -
java+lock+trylock_Lock的tryLock()方法
2021-03-10 01:46:18概述tryLock 是防止自锁的一个重要方式。tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,这个方法无论如何都会立即返回。在拿不到...概述
tryLock 是防止自锁的一个重要方式。
tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
package test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//学习 tryLock
//tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
public class tryLock {
public static void main(String[] args) {
System.out.println("开始");
final Lock lock = new ReentrantLock();
new Thread() {
@Override
public void run() {
String tName = Thread.currentThread().getName();
if (lock.tryLock()) {
System.out.println(tName + "获取到锁!");
} else {
System.out.println(tName + "获取不到锁!");
return;
}
try {
for (int i = 0; i < 5; i++) {
System.out.println(tName + ":" + i);
}
Thread.sleep(5000);
} catch (Exception e) {
System.out.println(tName + "出错了!!!");
} finally {
System.out.println(tName + "释放锁!!");
lock.unlock();
}
}
}.start();
new Thread() {
@Override
public void run() {
String tName = Thread.currentThread().getName();
if (lock.tryLock()) {
System.out.println(tName + "获取到锁!");
} else {
System.out.println(tName + "获取不到锁!");
return;
}
try {
for (int i = 0; i < 5; i++) {
System.out.println(tName + ":" + i);
}
} catch (Exception e) {
System.out.println(tName + "出错了!!!");
} finally {
System.out.println(tName + "释放锁!!");
lock.unlock();
}
}
}.start();
System.out.println("结束");
}
}
-
Lock 之 tryLock
2020-12-25 20:29:25tryLock 有两个重载的方法,分别如下: boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; tryLock() 会立马返回一个布尔值,如果获得了锁就返回 false;如果没有获得锁...tryLock 有两个重载的方法,分别如下:
boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
tryLock()
会立马返回一个布尔值,如果获得了锁就返回 true;如果没有获得锁就返回 false。无论是返回 true 还是 false,都会继续执行之后的代码。tryLock(long time, TimeUnit unit)
会等待指定的时间,如果时间到了还没获得锁就返回 false;如果在时间范围内获得了锁就立刻返回 true,不用等待时间结束。无论是返回 true 还是 false,都会继续执行之后的代码。我们来拿第二个方法进行测试,代码如下:
public class T03_ReentrantLock3 { Lock lock = new ReentrantLock(); int count = 10; void m1() { try { lock.lock(); for (int i = 0; i < count; i++) { TimeUnit.SECONDS.sleep(1); System.out.println(i + 1); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } void m2() { boolean tryLock = false; try { // 尝试在 5 秒内获得锁 tryLock = lock.tryLock(5, TimeUnit.SECONDS); System.out.println("m2..." + tryLock); } catch (Exception e) { e.printStackTrace(); } finally { if (tryLock) { lock.unlock(); } } } public static void main(String[] args) throws InterruptedException { T03_ReentrantLock3 reentrantLock3 = new T03_ReentrantLock3(); new Thread(reentrantLock3::m1).start(); TimeUnit.SECONDS.sleep(1); new Thread(reentrantLock3::m2).start(); } }
控制台输出如下:
1 2 3 4 5 6 m2...false 7 8 9 10
我们把变量
count
变为 2 再进行测试,控制台输出如下:1 2 m2...true
-
java trylock lock_Java多线程:tryLock()方法
2021-02-27 20:57:10Java多线程:tryLock()方法tryLock(long time, TimeUnit unit) 的作用在给定等待时长内锁没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时等待。package ...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()尝试获得锁,不会傻傻的等待,通过循环不停的再次尝试,如果等待的时间足够长,线程总是会获得想要的资源
}
}
-
Lock_TryLock.rar
2020-05-22 17:18:02本示例是基于QT多线程互锁的示例,介绍了QMutex lock,trylock以及QMutexLocker的用法区别。 -
java trylock lock_Java中Lock,tryLock,lockInterruptibly有什么区别?
2021-02-27 20:57:14ReentrantLock 锁有好几种,除了常用的lock ,tryLock ,其中有个lockInterruptibly 。先把API粘贴上来lockpublic void lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1... -
java trylock超时_java trylock以及可中断锁
2021-02-26 14:55:41tryLock方法试图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他事。可以调用tryLock时,使用超时参数。lock方法不能被中断。如果一个线程在等待获得一个锁时被中断,中断... -
java中ReentrantLock类的tryLock和tryLock的例子和用法
2019-09-22 16:12:20ReentrantLock类的tryLock和tryLock(时间) tryLock的方法就是试一下,如果能得到锁,就返回真,如果当时得不到,马上就返回假,绝不等。tryLock(时间)的用法就是 在规定的时间内设法得到锁。如果在规定的时间内最终... -
java trylock lock_java-tryLock()在循环中?
2021-02-27 20:57:11在tryLock()上反复循环也具有等待锁(如果锁不可用)的效果,但是不允许适当的OS控制的阻塞和唤醒等待线程.相反,等待线程将继续占用CPU,从而消耗CPU时间和功率,同时等待释放锁.在最坏的情况之一2中,拥有该锁的线程可能... -
java trylock_Java中Lock,tryLock,lockInterruptibly有什么区别?
2021-03-06 16:18:03ReentrantLock 锁有好几种,除了常用的lock ,tryLock ,其中有个lockInterruptibly 。先把API粘贴上来lockpublic void lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1... -
java trylock_Java 1.4中Lock.tryLock()的替代方法
2021-03-06 16:18:33如果您需要支持tryLock操作的Lock,则不能使用Java的固有锁定功能.您必须实现自己的Lock类,该类维护所需的状态,即所有者Thread和计数器,并且可能使用固有锁定来实现其线程安全的更新和阻止(在较旧的Java版本中没有很... -
java中的trylock_java-tryLock()在循环中?
2021-03-13 23:59:57tryLock()可能无法获取锁.因此,如果我们使用返回值执行工作,那么我们可能根本不做任何工作.Lock lock = new ReentrantLock();boolean isLocked = lock.tryLock();if (isLocked) {try {doWork();} finally {lock.... -
tryLock() 和 tryLock(long timeout, TimeUnit unit)
2020-02-15 12:27:25两者都是接口Lock中定义的方法标准,tryLock()立即获取锁并返回true,否则false;tryLock(long timeout, TimeUnit unit)则指定了容忍时间。ReentrantLock 类是Lock实现类之一,以下对这个类说明: 他们都是尝试获取... -
java trylock_Java源码阅读之ReentrantLock - lockInterruptibly和tryLock方法
2021-03-06 16:17:59阅读优秀的源码是提升编程技巧的重要手段之...碎碎念上一篇博客阅读了Java的ReentrantLock的lock和unlock,这篇分析另外三个方法lockInterruptibly、tryLock()和tryLock(long time, TimeUnit unit) throws Interrup... -
lock tryLock lockinterruptibly 区别
2017-07-27 18:03:32锁有好几种,除了常用的lock ,tryLock ,其中有个lockInterruptibly 。 1)lock(), 拿不到lock就不罢休,不然线程就一直block。 比较无赖的做法。 2)tryLock(),马上返回,拿到lock就返回true,不然返回false... -
Mutex的lock tryLock 区别
2018-11-11 06:54:35Mutex的lock tryLock 区别 -
trylock方法
2018-12-29 09:48:00synchronized 是不占用到手不罢休的,会一直试图占用下去。... 如果时间到了,还占用不成功,扭头就走~注意: 因为使用trylock有可能成功,有可能失败,所以后面unlock释放锁的时候,需要判断是否占用成... -
ReentrantLock源码lock和tryLock区别
2021-04-12 20:36:23在reentrantLock中,提供了一个lock和一个tryLock方法,这两个方法是有区别的,这篇笔记主要记录下具体的区别信息 结论 其实对于这个两个方法,简单来说,tryLock()方法,返回的是一个boolean类型变量,返回true,... -
Lock.tryLock with lease time
2021-01-10 14:17:34<div><p>Hazelcast has lock with lease time feature but does not support tryLock with lease time</p><p>该提问来源于开源项目:hazelcast/hazelcast</p></div> -
Thread--lock,lockInterruptibly,tryLock,tryLock(long timeout, TimeUnit unit)
2017-02-08 16:15:00lock,tryLock,lockInterruptibly 分别对应无限制锁,定时锁(通过while可以作为轮询锁),可中断锁。 Lock接口的 线程请求锁的 几个方法: lock(), 拿不到lock就不罢休,不然线程就一直bl... -
java+lock+trylock_java – FileChannel tryLock()方法是检查锁还是只是破坏它们?
2021-03-10 01:46:04我有两个进程可以查看相同的文件,并希望实现文件锁定.问题似乎是一个进程用java编写而另一个进程用C编写,并且不清楚java端如何实现低级锁定.该平台是Solaris 10....但是,java tryLock()会在第二次尝试时... -
ReentrantLock中的lockInterruptibly、lock、tryLock
2020-03-14 18:48:58ReentrantLock中的lockInterruptibly、lock、tryLock 这篇文章的思路: 首先尝试着阅读Java文档(双语对照) 了解几个关键类之间的关系 通过源代码来了解lock、lockInterruptibly、tryLock的流程 最后总结三者的区别 ... -
Redis分布式锁-tryLock
2019-05-10 15:03:05使用tryLock无参方法时,redisson会自动添加一个定时任务,定时刷新锁的失效时间,如果unlock时失败,则会出现该锁一直不释放的情况。 而当tryLock传释放时间时,则不会添加这个定时任务。 测试如下: 1、try... -
Lock的tryLock()方法
2016-11-21 14:49:58tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。 代码 ... -
Java Lock 之 lock,tryLock 和 lockInterruptibly
2018-12-04 19:33:18lock,tryLock 和 lockInterruptibly 是 Java ReentrantLock 对象提供的三种获取锁的方式。 某个线程调用ReentrantLock 对象的 lock 方法后,如果锁尚未被其它线程占有,则该线程将获得锁;如果锁已经被其它线程占有... -
Java中Lock,tryLock,lockInterruptibly, ReentrantLock
2020-05-03 23:50:17Java中Lock,tryLock,lockInterruptibly, ReentrantLock -
JUC并发进阶之lock锁方法Lock,tryLock,lockInterruptibly
2020-09-12 10:56:091、trylock package lock.lock; import java.util.Random; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util....