zoukankan      html  css  js  c++  java
  • ReentrantLock的使用

    package concurrent._ReentrantLock;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    //一个关于Lock的最基本操作,lock.lock()与lock.unlock()
    public class MyReentrantLock {
    
        private static Lock lock = new ReentrantLock();
        private static int count = 0;
    
        public static void main(String[] args) throws InterruptedException {
            MyReentrantLock mylock = new MyReentrantLock();
    
            Thread a = new Thread("A"){
                @Override
                public void run() {
                    mylock.lockinsert(Thread.currentThread());
                }
            };
            a.start();
            Thread b = new Thread("B"){
                @Override
                public void run() {
                    mylock.lockinsert(Thread.currentThread());
                }
            };
            b.start();
            Thread c = new Thread("C"){
                @Override
                public void run() {
                    mylock.lockinsert(Thread.currentThread());
                }
            };
            c.start();
    
            //等待三个线程结束后输出count的值,可以使用一个闭锁
            Thread.sleep(1000);
            System.out.println(count);
    
    
    
    
        }
    
        public void lockinsert(Thread thread){
            lock.lock();
            //线程如果没有获得锁,就会阻塞在此处,获得锁之后才能后续操作
    
            try{
                System.out.println("线程" + thread.currentThread().getName() + "获得了锁");
    
                for(int i = 0 ; i < 1000 ; i ++){
                    count++;
                }
    
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                System.out.println("线程" + thread.currentThread().getName() + "释放了锁");
    
                lock.unlock();
            }
        }
    
    
    
    }

    结果:

    线程A获得了锁
    线程A释放了锁
    线程B获得了锁
    线程B释放了锁
    线程C获得了锁
    线程C释放了锁
    3000

    trylock()

    package concurrent._ReentrantLock;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    //一个关于Lock的最基本操作,lock.lock()与lock.unlock()
    public class MyReentrantLock1 {
    
        private static Lock lock = new ReentrantLock();
        private static int count = 0;
    
        public static void main(String[] args) throws InterruptedException {
            MyReentrantLock1 mylock = new MyReentrantLock1();
    
            Thread a = new Thread("A"){
                @Override
                public void run() {
                    mylock.trylockinsert(Thread.currentThread());
                }
            };
            a.start();
            Thread b = new Thread("B"){
                @Override
                public void run() {
                    mylock.trylockinsert(Thread.currentThread());
                }
            };
            b.start();
            Thread c = new Thread("C"){
                @Override
                public void run() {
                    mylock.trylockinsert(Thread.currentThread());
                }
            };
            c.start();
    
            //等待三个线程结束后输出count的值,可以使用一个闭锁
            Thread.sleep(1000);
            System.out.println(count);
    
    
    
    
        }
    
        public void trylockinsert(Thread thread){
            if(lock.tryLock()){
                try{
                    System.out.println("线程" + thread.currentThread().getName() + "已经尝试获得了锁");
    
                    for(int i = 0 ; i < 1000 ; i ++){
                        count++;
                    }
    
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    System.out.println("线程" + thread.currentThread().getName() + "释放了锁");
    
                    lock.unlock();
                }
            }else{
                System.out.println("线程" + thread.currentThread().getName() + "尝试获得锁失败");
    
            }
    
        }
    
    
    
    }

    结果:

    线程C尝试获得锁失败
    线程A尝试获得锁失败
    线程B已经尝试获得了锁
    线程B释放了锁
    1000

    修改代码,使用tryLock(time,TimeUnit)

    package concurrent._ReentrantLock;
    
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Demo3 {
        private static Lock lock = new ReentrantLock();
        private static int count = 0;
    
        public static void main(String[] args) throws InterruptedException {
            Demo3 demo = new Demo3();
    
            Thread a = new Thread("A"){
                @Override
                public void run() {
                    try {
                        demo.trylockinsert(Thread.currentThread());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            a.start();
            Thread b = new Thread("B"){
                @Override
                public void run() {
                    try {
                        demo.trylockinsert(Thread.currentThread());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            b.start();
            Thread c = new Thread("C"){
                @Override
                public void run() {
                    try {
                        demo.trylockinsert(Thread.currentThread());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            c.start();
    
            //一秒钟之后中断b,这个时候b应该还在等待获得锁
            Thread.sleep(1000);
            System.out.println("主线程尝试中断bThread");
            b.interrupt();
    
    
        }
    
    
        public void trylockinsert(Thread thread) throws InterruptedException {
    
            //线程如果没有获得锁,就会阻塞在此处,获得锁之后才能后续操作
            if(lock.tryLock(4, TimeUnit.SECONDS)){
                try{
                    System.out.println("线程" + thread.currentThread().getName() + "获 得了锁");
                    long now = System.currentTimeMillis();
                    while(System.currentTimeMillis() - now < 5000){
                        //让线程在while循环里面空转5秒钟
                        
                    }
    
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    System.out.println("线程" + thread.currentThread().getName() + "释 放了锁");
    
                    lock.unlock();
                }
            }else{
                System.out.println("线程" + thread.currentThread().getName() + "放弃了对锁的获取");
    
            }
    
        }
    }

    结果显示:线程A获得锁,线程B和C等待锁的释放4秒钟,但是一秒钟后b被主线程中断,C在四秒钟后放弃了对锁的获取。

    线程A获 得了锁
    主线程尝试中断bThread
    java.lang.InterruptedException
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireNanos(AbstractQueuedSynchronizer.java:936)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireNanos(AbstractQueuedSynchronizer.java:1247)
        at java.util.concurrent.locks.ReentrantLock.tryLock(ReentrantLock.java:442)
        at concurrent._ReentrantLock.Demo3.trylockinsert(Demo3.java:60)
        at concurrent._ReentrantLock.Demo3$2.run(Demo3.java:29)
    线程C放弃了对锁的获取
    线程A释 放了锁
  • 相关阅读:
    C#使用System.IO.Path获取文件路径、文件名
    C# 中的await
    深度学习笔记
    单例模式
    hbase的写和读,大合并和小合并
    自定义kafka Sink
    combineByKey
    spark练习题
    sparkonhbase
    HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成增删改查功能
  • 原文地址:https://www.cnblogs.com/da-peng/p/10006231.html
Copyright © 2011-2022 走看看