精华内容
下载资源
问答
  • 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
    展开全文
  • 概述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:25
    tryLock 有两个重载的方法,分别如下: 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()方法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的用法区别。
  • ReentrantLock 锁有好几种,除了常用的lock ,tryLock ,其中有个lockInterruptibly 。先把API粘贴上来lockpublic void lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1...
  • tryLock方法试图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他事。可以调用tryLock时,使用超时参数。lock方法不能被中断。如果一个线程在等待获得一个锁时被中断,中断...
  • ReentrantLock类的tryLocktryLock(时间) tryLock的方法就是试一下,如果能得到锁,就返回真,如果当时得不到,马上就返回假,绝不等。tryLock(时间)的用法就是 在规定的时间内设法得到锁。如果在规定的时间内最终...
  • tryLock()上反复循环也具有等待锁(如果锁不可用)的效果,但是不允许适当的OS控制的阻塞和唤醒等待线程.相反,等待线程将继续占用CPU,从而消耗CPU时间和功率,同时等待释放锁.在最坏的情况之一2中,拥有该锁的线程可能...
  • ReentrantLock 锁有好几种,除了常用的lock ,tryLock ,其中有个lockInterruptibly 。先把API粘贴上来lockpublic void lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1...
  • 如果您需要支持tryLock操作的Lock,则不能使用Java的固有锁定功能.您必须实现自己的Lock类,该类维护所需的状态,即所有者Thread和计数器,并且可能使用固有锁定来实现其线程安全的更新和阻止(在较旧的Java版本中没有很...
  • tryLock()可能无法获取锁.因此,如果我们使用返回值执行工作,那么我们可能根本不做任何工作.Lock lock = new ReentrantLock();boolean isLocked = lock.tryLock();if (isLocked) {try {doWork();} finally {lock....
  • 两者都是接口Lock中定义的方法标准,tryLock()立即获取锁并返回true,否则false;tryLock(long timeout, TimeUnit unit)则指定了容忍时间。ReentrantLock 类是Lock实现类之一,以下对这个类说明: 他们都是尝试获取...
  • 阅读优秀的源码是提升编程技巧的重要手段之...碎碎念上一篇博客阅读了Java的ReentrantLock的lock和unlock,这篇分析另外三个方法lockInterruptibly、tryLock()和tryLock(long time, TimeUnit unit) throws Interrup...
  • 锁有好几种,除了常用的lock ,tryLock ,其中有个lockInterruptibly 。 1)lock(), 拿不到lock就不罢休,不然线程就一直block。 比较无赖的做法。 2)tryLock(),马上返回,拿到lock就返回true,不然返回false...
  • Mutex的lock tryLock 区别

    2018-11-11 06:54:35
    Mutex的lock tryLock 区别
  • trylock方法

    2018-12-29 09:48:00
    synchronized 是不占用到手不罢休的,会一直试图占用下去。... 如果时间到了,还占用不成功,扭头就走~注意: 因为使用trylock有可能成功,有可能失败,所以后面unlock释放锁的时候,需要判断是否占用成...
  • 在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>
  • lock,tryLock,lockInterruptibly 分别对应无限制锁,定时锁(通过while可以作为轮询锁),可中断锁。 Lock接口的 线程请求锁的 几个方法: lock(), 拿不到lock就不罢休,不然线程就一直bl...
  • 我有两个进程可以查看相同的文件,并希望实现文件锁定.问题似乎是一个进程用java编写而另一个进程用C编写,并且不清楚java端如何实现低级锁定.该平台是Solaris 10....但是,java tryLock()会在第二次尝试时...
  • ReentrantLock中的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:58
    tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。 代码 ...
  • lock,tryLock 和 lockInterruptibly 是 Java ReentrantLock 对象提供的三种获取锁的方式。 某个线程调用ReentrantLock 对象的 lock 方法后,如果锁尚未被其它线程占有,则该线程将获得锁;如果锁已经被其它线程占有...
  • Java中Lock,tryLock,lockInterruptibly, ReentrantLock
  • 1、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....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,646
精华内容 4,258
关键字:

trylock