zoukankan      html  css  js  c++  java
  • java synchronized和(ReentrantLock)区别

    原文:http://blog.csdn.net/zheng548/article/details/54426947

    区别一:API层面

    syschronized使用

    synchronized即可修饰方法,也可以修饰代码块。

    synchronized修饰方法时,如下所示:

    //synchronized修饰一个方法时,这个方法叫同步方法
    public synchronized void test(){
        //方法体
    }
    

    synchronized修饰代码块时,包涵两部分:锁对象的引用和这个锁保护的代码块。如下所示:

    synchronized (0bject){
        //括号中表示需要锁的对象
         //线程执行时会对object上锁      
    }
    

    ReentrantLock使用

    public class test(){
        private Lock lock=new ReentrantLock();
        public void testMethod(){
            try{
                lock.lock();
                //code
            }  
            finally{
                lock.unlock();
            }    
        }   
    }            
    

    区别二:等待可中断

    引用周志明的《深入理解Java虚拟机》Page 392

    等待可中断是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。可等待特性对处理执行时间非常长的同步块很有帮助。

    具体说来,假如业务代码中有两个线程,Thread1 Thread2.假设Thread1获取了对象object的锁,Thread2将等待Thread1释放object的锁。

    • 使用synchronized。如果Thread1不释放,Thread2将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁(mutual exclusion lock ,mutex)的角色,一个线程引用锁的时候,别的线程阻塞等待。

    • 使用ReentrantLock。如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。

    区别三:公平锁

    引用周志明的《深入理解Java虚拟机》Page 392

    公平锁是指多个线程在等待同一个锁时,必须按照申请的时间顺序来依次获得锁;而非公平锁则不能保证这一点。非公平锁在锁被释放时,任何一个等待锁的线程都有机会获得锁。 synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁,但可以通过带布尔值的构造函数要求使用公平锁。

    区别四:绑定多个条件

     ReentrantLock可以同时绑定多个Condition对象,只需多次调用newCondition方法即可。

    synchronized中,锁对象的wait和notify() 或notifyAll()方法可以实现一个隐含的条件。但如果要和杜宇一个的条件关联的时候就不得不额外添加一个锁。

    区别五:性能

    JDK 1.5中,synchronized还有很大的优化余地。JDK 1.6 中加入了很多针对锁的优化措施,synchronized与ReentrantLock性能方面基本持平。虚拟机在未来的改进中更偏向于原生的synchronized。

    补充:

    ①Java中每个对象都有一个锁(lock)或者叫做监视器(monitor).

    ②ReentrantLock和synchronized持有的对象监视器不同。

    ③如果synchronized方法是static的,那么当线程方法改方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在对象所对应的class对象,因为java中不管一个类有多少对象,这些对象会应对唯一一个Class对象。因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,是顺序执行的,即一个线程先执行,另一个才开始。

    ④synchronized方法是一种粗粒度的并发控制,某一时刻只能有一个线程执行synchronized方法,synchronized快则是一种细粒度的并发控制。只会将 块中代码同步,位于方法内,synchronized块之外的是可以被多个线程同时访问的。

    ⑤synchronized关键字经过编译之后,会在同步块的前后分别形成monitorenter和monitorexit两个字节码指令,操作对象均为锁的计数器。

    ⑥相同点:都是可重入的。可重入值的是同一个线程多次试图获取它所占的锁,请求会成功。当释放的时候,直到冲入次数清零,锁才释放。

  • 相关阅读:
    session机制、cookie机制
    TCP报头格式
    python中with语句的使用
    html一些东东
    jquery 几点注意事项
    C# 一些小东东
    Microsoft Jet 数据库引擎找不到对象'Sheet1$_'。请确定对象是否存在,并正确地写出它的名称和路径
    DataTable Select查询
    js求指定时间的周一和周日
    asp.net 页面执行过程
  • 原文地址:https://www.cnblogs.com/baxianhua/p/9370705.html
Copyright © 2011-2022 走看看