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()来释放锁,所一段被锁保护的代码可以调用另一个被相同锁保护的方法

  • 相关阅读:
    AJAX获取服务器当前时间
    Struts2的入门实例
    Java 测试技术3 Struts框架驱动(StrutsTestCase)
    Java单元测试技术1
    软件测试自动化:自动化工厂
    MySQL优化原理
    fetch_array()与fetch_assoc()的用法
    sometimesever js中创建数组,并往数组里添加元素
    将三维数组中的同名的键拆分成三维数组的每个数组中包括原来不同的二维数组的键...
    php serialize讲解与json性能测试
  • 原文地址:https://www.cnblogs.com/Mrxiaolong/p/5428917.html
Copyright © 2011-2022 走看看