zoukankan      html  css  js  c++  java
  • 简述synchronized和java.util.concurrent.locks.Lock的异同?

    主要相同点:Lock能完成synchronized所实现的所有功能 。

    主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

    举例说明(对下面的题用lock进行了改写):

    
    package com.huawei.interview;
    
    import java.util.concurrent.locks.Lock;    
    import java.util.concurrent.locks.ReentrantLock;   
    
    
    
    public class ThreadTest {
    
        private int j;
    
        private Lock lock = new ReentrantLock();
    
        public static void main(String[] args) {
    
            ThreadTest tt = new ThreadTest();
    
            for(int i=0;i<2;i++){
    
                new Thread(tt.new Adder()).start();
    
                new Thread(tt.new Subtractor()).start();
    
            }
    
        }
    
        private class Subtractor implements Runnable{
    
            public void run() {
    
                while(true){
    
                    /*synchronized (ThreadTest.this) {            
    
                        System.out.println(“j--=” + j--);
    
                        //这里抛异常了,锁能释放吗?
    
                    }*/
    
                    lock.lock();
    
                    try{
    
                        System.out.println(“j--=” + j--);
    
                    }finally{
    
                        lock.unlock();
    
                    }
    
                }
    
            }
    
        }
    
    
    
        private class Adder implements Runnable{
    
            public void run() {
    
                while(true){
    
                    /*synchronized (ThreadTest.this) {
    
                    System.out.println(“j++=” + j++);    
    
                    }*/
    
                    lock.lock();
    
                    try{
    
                        System.out.println(“j++=” + j++);
    
                    }finally{
    
                        lock.unlock();
    
                    }
    
                }
    
            }
    
        }
    
    }
  • 相关阅读:
    2017 ACM-ICPC, Universidad Nacional de Colombia Programming Contest gym101466 题解
    Codeforces Round #634 (Div. 3)题解
    AtCoder Beginner Contest 162 题解
    2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest-gym 102091 题解
    多线程资料
    文件自动导入
    GWT+CodeTemplate+TableCreate快速开发
    阅读大神博客笔记
    Java数据类型
    Java断言assert
  • 原文地址:https://www.cnblogs.com/yuyu666/p/9733772.html
Copyright © 2011-2022 走看看