美文网首页
锁(ReentrantLock、ReentrantReadWri

锁(ReentrantLock、ReentrantReadWri

作者: 笑才 | 来源:发表于2018-10-28 14:11 被阅读0次

    参考:https://www.cnblogs.com/dolphin0520/p/3923167.html

    1、ReentrantLock(实现Lock接口)

    public class LockTest01 {
        private Lock lock = new ReentrantLock();
        private ArrayList<Integer> arrayList = new ArrayList<Integer>();
        public static void main(String[] args) {
            final LockTest01 test = new LockTest01();
            new Thread(){
                public void run(){
                    test.insert(Thread.currentThread());
                }
            }.start();
            new Thread(){
                public void run(){
                    test.insert(Thread.currentThread());
                }
            }.start();
        }
        
        public void insert(Thread thread){
            lock.lock();//获得锁,如果获取不到则线程等待
            //lock.lockInterruptibly();可中断的获取锁,获取不到时可以中断线程(注意:线程获取到锁后是不能被中断的)
            //lock.tryLock();尝试获取锁,返回boolean值,获取到返回true否则返回false,线程不等待
            try {
                System.out.println(thread.getName()+"得到了锁");
                for(int i=0;i<5;i++){arrayList.add(i);}
            } catch (Exception e) {
                
            } finally{
                System.out.println(thread.getName()+"释放了锁");
                lock.unlock();//解锁
            }
        };
    }
    

    2、ReentrantReadWriteLock读写锁 (实现了ReadWriteLock接口)

    ReentrantLock lock = new ReentrantLock(true);设置锁的公平性
    ReentrantReadWriteLock里面提供了很多丰富的方法,不过最主要的有两个方法:readLock()和writeLock()用来获取读锁和写锁。

    public class LockTest02 {
        private ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock();
        public static void main(String[] args) {
            final LockTest02 test = new LockTest02();
            new Thread(){
                public void run(){
                    test.get(Thread.currentThread());
                }
            }.start();
            new Thread(){
                public void run(){
                    test.get(Thread.currentThread());
                }
            }.start();
        }
        
        public void get(Thread thread){
            rwlock.readLock().lock();
            try {
                long startTime = System.currentTimeMillis();
                while(System.currentTimeMillis()-startTime<1){
                    System.out.println(thread.getName()+"正在进行读操作");
                }
                System.out.println(thread.getName()+"读操作完毕");
            } catch (Exception e) {
            } finally{
                rwlock.readLock().unlock();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:锁(ReentrantLock、ReentrantReadWri

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