zoukankan      html  css  js  c++  java
  • Java锁机制ReentrantLock

    ReentrantLock 锁常用于保证程序的人为顺序执行。

    写一个类模拟ReentrantLock类的功能

    class MyLock{
        private boolean lock = false;
        private int holdCount = 0;
        private Thread myThread = null; //当前占用锁的线程
        public synchronized void lock(){ //线程同步,只允许一个线程来获取这把锁
            Thread currThread = Thread.currentThread();   //当前访问线程
            if(lock == true && currThread != myThread){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //给予锁
            myThread = currThread;
            lock = true;
            holdCount ++;
        }
        public synchronized  void unlock(){
            Thread currThread = Thread.currentThread();   //当前访问线程
            if(currThread == myThread && holdCount>0){
                holdCount -- ;
                if(holdCount == 0){
                    notifyAll();
                    lock = false;
                    myThread = null;
                }
            }
        }
    
        public int getHoldCount() {
            return holdCount;
        }
    }

    当一个线程不能得到一把锁时就会产生等待,等到其他线程释放锁后其将被唤醒,然后拿到所继续运行。

    public class Test {
        public static void main(String[] args) {
            MyLock myLock = new MyLock();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    myLock.lock();
                    System.out.println(Thread.currentThread().getName()+"得到锁:"+myLock.getHoldCount());
                    myLock.lock();  //可重入锁
                    System.out.println(Thread.currentThread().getName()+"重入成功:"+myLock.getHoldCount());
                    myLock.unlock();
                    System.out.println(Thread.currentThread().getName()+"释放锁:"+myLock.getHoldCount());
                    myLock.unlock();
                    System.out.println(Thread.currentThread().getName()+"释放锁:"+myLock.getHoldCount());
                }
            }).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    myLock.lock();
                    System.out.println(Thread.currentThread().getName()+"得到锁:"+myLock.getHoldCount());
                    myLock.unlock();
                    System.out.println(Thread.currentThread().getName()+"释放锁:"+myLock.getHoldCount());
                }
            }).start();
        }
    }

    ReentrantLock的使用

    public class LockTest {
        ReentrantLock lock = new ReentrantLock();
        public void a() throws InterruptedException {
            lock.lock();
            System.out.println(lock.getHoldCount());
            dosomething();
            lock.unlock();
            System.out.println(lock.getHoldCount());
        }
        public void dosomething() throws InterruptedException {
            lock.lock();
            System.out.println(lock.getHoldCount());
            lock.unlock();
            System.out.println(lock.getHoldCount());
        }
        public static void main(String[] args) throws InterruptedException {
            LockTest lockTest = new LockTest();
            lockTest.a();
        }
    }
  • 相关阅读:
    promiseall 使用一个ajax就可以调全部数据
    PHP中include和require的区别详解和使用建议
    phpredis中的connect和pconnect的区别
    <a>标签中的href="javascript:;"是什么意思?
    PHP中关于时间,时间戳 时区的设置问题
    javascript 超狠恶毒的禁用 右键 按键 禁用开发者工具 方法
    安装NoSQL数据库类型的redis 和 memcache数据库及其扩展
    XMind思维导图软件
    PHP代码中解决出现中文乱码的问题
    (七)mybatis-plus之generator(ftl模板生成:lombok swagger2 controloer的crud)
  • 原文地址:https://www.cnblogs.com/chiweiming/p/11223127.html
Copyright © 2011-2022 走看看