美文网首页
Lock接口中的一些方法

Lock接口中的一些方法

作者: 永远的太阳0123 | 来源:发表于2018-09-18 19:27 被阅读0次

(1)tryLock()方法:尝试锁,如果无法获取锁标记,返回false;如果获取了锁标记,返回true。
(2)tryLock(long time, TimeUnit unit):阻塞尝试锁。参数代表时长,在指定时长内尝试锁。
(3)unlock():如果没有获取锁标记就放锁,会抛出异常。
(4)lockInterruptibly():获取锁,如果锁可用则线程继续执行;如果锁不可用则线程进入阻塞状态,此时可以在其它线程执行时调用这个线程的interrupt方法打断它的阻塞状态。

示例一:

public class Test2 {
    Lock lock = new ReentrantLock();

    public void m1() {
        try {
            lock.lock();// 加锁
            for (int i = 0; i < 10; i++) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println("public void m1()" + i);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();// 解锁
        }
    }

    public void m2() {
        boolean isLocked = false;
        try {
            // 尝试锁,如果无法获取锁标记,返回false;如果获取了锁标记,返回true
            // isLocked = lock.tryLock();

            // 阻塞尝试锁
            // 参数代表时长,在指定时长内尝试锁
            isLocked = lock.tryLock(5, TimeUnit.SECONDS);
            if (isLocked) {
                System.out.println("public void m2() synchronized");
            } else {
                System.out.println("public void m2() unsynchronized");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (isLocked) {
                // 先判断是否获取了锁标记。如果获取了锁标记,放锁
                // 如果没有获取锁标记就放锁,会抛出异常
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        Test2 t = new Test2();
        new Thread(new Runnable() {
            public void run() {
                t.m1();
            }
        }).start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(new Runnable() {
            public void run() {
                t.m2();
            }
        }).start();
    }
}

示例二:

public class Test3 {
    Lock lock = new ReentrantLock();

    public void m1() {
        try {
            lock.lock();
            for (int i = 0; i < 5; i++) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println("public void m1()" + i);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void m2() {
        try {
            // 等待锁,线程进入阻塞状态
            // 可以在其它线程执行时调用这个线程的interrupt方法打断它的阻塞状态
            lock.lockInterruptibly();
            System.out.println("public void m2()");
        } catch (InterruptedException e) {
            System.out.println("public void m2() interrupted");
        } finally {
            try {
                lock.unlock();// 如果阻塞状态被打断,因为没有获取锁标记就放锁,会抛出异常
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        final Test3 t = new Test3();
        new Thread(new Runnable() {
            public void run() {
                t.m1();
            }
        }).start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Thread t2 = new Thread(new Runnable() {
            public void run() {
                t.m2();
            }
        });
        t2.start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.interrupt();// 打断t2线程的阻塞状态
    }
}

相关文章

  • Lock接口中的一些方法

    (1)tryLock()方法:尝试锁,如果无法获取锁标记,返回false;如果获取了锁标记,返回true。(2)t...

  • 多线程-AQS-Condition

    by shihang.mai 使用 源码分析 Lock接口中还有一个方法newCondition,创建一个条件队列...

  • ReentrantLock锁(二)

    ReentantLock 继承接口Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完成synchron...

  • 重温系列之多线程并发:ReentrantLock

    ReentantLock 继承接口 Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完成 synchr...

  • reentrantLock的lock和unLock分析

    lock()方法 1.入口方法:ReentrantLock.lock()方法. 主要逻辑交给了内部类FairSyn...

  • 高并发(16)-显示锁Lock

    @TOC 前言 上篇文章讲解了AQS,今天就讲讲显示锁Lock 什么是Lock Lock是一接口,实现了锁功能的接...

  • ReentantLock核心代码

    Lock接口 Reentrant实现了Lock接口,Lock接口主要定义了如下几个方法: ReentrantLoc...

  • ReentrantLock的原理

    ReentrantLock实现了Lock接口,提供了lock、trylock、unlock等方法。这些方法通过AQ...

  • juc-locks框架之接口

    juc-locks锁框架中一共就三个接口:Lock、Condition、ReadWriteLock 一、Lock接...

  • Java condition和Object

    Java Lock与Condition Lock接口提供的方法 既然在Lock中出现这么多的interrupt,那...

网友评论

      本文标题:Lock接口中的一些方法

      本文链接:https://www.haomeiwen.com/subject/etvmnftx.html