zoukankan      html  css  js  c++  java
  • 再回首Java第十七天

    同步锁
    JDk1.5之后,java提供了另一种线程同步机制:它通过显式定义同步锁对象来实现线程同步,在这种机制下,同步锁应该使用Lock对象充当。
    通常认为:Lock提供了比synchronized方法和synchronized代码块更广泛的操作,Lock实现允许更灵活的结构,可以具有很大的差别的属性,并且可以支持多个相关的Condition对象
    Lock是控制多个线程对共享资源进行访问的工具。通常Lock提供了对共享资源的独占访问,每次只允许一个线程对Lock对象加锁,线程访问共享资源之前应先获得Lock对象,不过某些Lock可能允许共享资源的并发访问,如ReadWriteLock(读写锁),当然在实现线程安全控制中通常喜欢使用ReentrantLock(可重入锁)通常使用Lock的代码格式如下
    class X{
    //定义锁对象
    private final ReentrantLock lock=new ReentrantLock();
    //需要保证线程的方法
    public void m(){
    lock.lock();
    try{
    //需呀保证线程安全的代码块
    .....
    }finally{
    lock.unlock()
    }
    }
    使用Lock对象进行同步是,锁定和释放锁出现在不同作用范围中时,通常建议使用finally块来确保在必要时释放锁
    使用Lock与使用同步方法有点类似,只是使用Lock是显式的指定Lock对象作为同步锁,而使用同步方法时隐式地使用当前对象作为同步监视器
    同步方法和同步代码块使用与竞争资源相关的,隐式的同步监视器,并且强制要求加锁和释放锁要出现在同一个块结构中,而且当获取了多个锁是,它们必须以相反的顺序释放,且必须在所有锁被获取是相同的范围内释放锁。
    Lock提供了同步方法和同步代码块没有的功能,包括用于非块结构的tryLock方法,以及试图获取可中断锁的lockInterruptibly()方法,还有获取超时失效所的tryLock(long,TimeUnit)方法
    ReentrantLock锁具有重入性,也就是线程可以对已经加锁的ReentrantLock锁再次加锁,ReentrantLock会维持一个计数器来跟踪Lock方法的嵌套调用,线程在每次lock()加锁后,必须显式调用unLock()来释放锁,所一段被锁保护的代码可以调用另一个被相同锁保护的方法

  • 相关阅读:
    【iOS学习笔记】iOS启动顺序
    【iOS学习笔记】iOS算法(四)之冒泡排序
    【iOS学习笔记】iOS算法(五)之折半查找
    【iOS学习笔记】iOS算法(三)之插入排序
    【iOS学习笔记】iOS算法(二)之选择排序
    【iOS学习笔记】iOS算法(一)快速排序算法
    【iOS学习笔记】iOS ⾃自定义cell的步骤
    【iOS学习笔记】IOS开发中设置applicationIconBadgeNumber和消息推送
    【iOS学习笔记】iOS 9:改用更安全的HTTPS
    2015/10/6 iOS 笔记 细节 应用中常见文件
  • 原文地址:https://www.cnblogs.com/Mrxiaolong/p/5428917.html
Copyright © 2011-2022 走看看