`

低级别工具 —— 锁定和原子

 
阅读更多

 

Lock

Java 语言内置了锁定工具 —— synchronized 关键字。当线程获得监视器时(内置锁定),其他线程如果试图获得相同锁定,那么它们将被阻塞,直到第一个线程释放该锁定。同步还确保随后获得相同锁定的线程可以看到之前的线程在具有该锁定时所修改的变量的值,从而确保如果类正确地同步了共享状态的访问权,那么线程将不会看到变量的“失效”值,这是缓存或编译器优化的结果。

虽然同步没有什么问题,但它有一些限制,在一些高级应用程序中会造成不便。Lock 接口将内置监视器锁定的锁定行为普遍化,允许多个锁定实现,同时提供一些内置锁定缺少的功能,如计时的等待、可中断的等待、锁定轮询、每个锁定有多个条件等待集合以及无阻塞结构的锁定。

 

interface Lock {
    void lock(); 
    void lockInterruptibly() throws IE;
    boolean tryLock();
    boolean tryLock(long time, 
                    TimeUnit unit) throws IE;           
    void unlock();
    Condition newCondition() throws
                    UnsupportedOperationException; 
  }
 

 

 

ReentrantLock 是具有与隐式监视器锁定(使用 synchronized 方法和语句访问)相同的基本行为和语义的 Lock 的实现,但它具有扩展的能力。

作为额外收获,在竞争条件下,ReentrantLock 的实现要比现在的 synchronized 实现更具有可伸缩性。(有可能在 JVM 的将来版本中改进 synchronized 的竞争性能。)这意味着当许多线程都竞争相同锁定时,使用 ReentrantLock 的吞吐量通常要比 synchronized好。换句话说,当许多线程试图访问 ReentrantLock 保护的共享资源时,JVM 将花费较少的时间来调度线程,而用更多个时间执行线程。

虽然 ReentrantLock 类有许多优点,但是与同步相比,它有一个主要缺点 —— 它可能忘记释放锁定。建议当获得和释放ReentrantLock 时使用下列结构:

 

Lock lock = new ReentrantLock();
...
lock.lock(); 
try { 
  // perform operations protected by lock
}
catch(Exception ex) {
 // restore invariants
}
finally { 
  lock.unlock(); 
}
 

因为锁定失误(忘记释放锁定)的风险,所以对于基本锁定,强烈建议您继续使用 synchronized,除非真的需要 ReentrantLock 额外的灵活性和可伸缩性。ReentrantLock 是用于高级应用程序的高级工具 —— 有时需要,但有时用原来的方法就很好。

Condition

就像 Lock 接口是同步的具体化,Condition 接口是 Object 中 wait() 和 notify() 方法的具体化。Lock 中的一个方法是newCondition(),它要求锁定向该锁定返回新的 Condition 对象限制。await()signal() 和 signalAll() 方法类似于wait()notify() 和 notifyAll(),但增加了灵活性,每个 Lock 都可以创建多个条件变量。这简化了一些并发算法的实现。

ReadWriteLock

ReentrantLock 实现的锁定规则非常简单 —— 每当一个线程具有锁定时,其他线程必须等待,直到该锁定可用。有时,当对数据结构的读取通常多于修改时,可以使用更复杂的称为读写锁定的锁定结构,它允许有多个并发读者,同时还允许一个写入者独占锁定。该方法在一般情况下(只读)提供了更大的并发性,同时在必要时仍提供独占访问的安全性。ReadWriteLock 接口和ReentrantReadWriteLock 类提供这种功能 —— 多读者、单写入者锁定规则,可以用这种功能来保护共享的易变资源。

原子变量

即使大多数用户将很少直接使用它们,原子变量类(AtomicIntegerAtomicLongAtomicReference 等等)也有充分理由是最显著的新并发类。这些类公开对 JVM 的低级别改进,允许进行具有高度可伸缩性的原子读-修改-写操作。大多数现代 CPU 都有原子读-修改-写的原语,比如比较并交换(CAS)或加载链接/条件存储(LL/SC)。原子变量类使用硬件提供的最快的并发结构来实现。

许多并发算法都是根据对计数器或数据结构的比较并交换操作来定义的。通过暴露高性能的、高度可伸缩的 CAS 操作(以原子变量的形式),用 Java 语言实现高性能、无等待、无锁定的并发算法已经变得可行。

几乎 java.util.concurrent 中的所有类都是在 ReentrantLock 之上构建的,ReentrantLock 则是在原子变量类的基础上构建的。所以,虽然仅少数并发专家使用原子变量类,但 java.util.concurrent 类的很多可伸缩性改进都是由它们提供的。

原子变量主要用于为原子地更新“热”字段提供有效的、细粒度的方式,“热”字段是指由多个线程频繁访问和更新的字段。另外,原子变量还是计数器或生成序号的自然机制。

 

分享到:
评论

相关推荐

    基于SQL Server锁定数据技术的探讨.pdf

    在当今的信息化社会中,数据库系统是管理大量数据的核心工具,尤其在多用户环境下,保证数据的一致性和完整性至关重要。SQL Server作为一款广泛使用的数据库管理系统,其锁定技术是确保多用户环境下数据一致性的关键...

    事务管理(二)——SQL SERVER的事务管理

    压缩包中的lock_test.sql、SLOCK_Deadlock.sql和XLOCK_Deadlock.sql可能包含用于演示和分析死锁的示例代码,其中SLOCK和XLOCK分别代表共享锁和排他锁,是SQL Server锁定机制的一部分。 在处理死锁时,可以使用`sp_...

    ACCESS\SQL Server数据库转换MYSQL数据库工具

    “MYSQL”是流行的开源数据库,采用ACID(原子性、一致性、隔离性、持久性)事务模型,支持多种存储引擎,如InnoDB(支持行级锁定),MyISAM(强调读取性能)等,提供了丰富的数据类型和函数,以及高度的网络兼容性...

    数据库并发操作

    事务的四大特性——原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID属性,是保证并发操作正确性的基石。 1. **原子性**:事务中的所有操作要么全部执行,要么...

    MySQL技术InnoDB存储引擎_姜承尧_第2版

    书中会详细讲解四种隔离级别——读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ,MySQL默认级别)和串行化(SERIALIZABLE),以及它们在并发控制中的区别和应用场景。...

    面试常问必备之MySQL面试55题.zip

    5. **事务处理**:理解ACID属性——原子性、一致性、隔离性和持久性,以及不同隔离级别(读未提交、读已提交、可重复读和串行化)的影响。 6. **视图**:视图可以简化复杂查询,并提供安全性,因为它可以限制用户对...

    VMware vSphere APIs

    VMware vSphere APIs是VMware公司提供的一套用于与vSphere环境进行交互的接口,它允许开发者、系统管理员和自动化工具直接与虚拟化平台进行深度集成。这些APIs包括了SOAP、RESTful以及Python SDK等多种形式,使得...

    数据库33页模拟卷数据库33页模拟卷.doc

    1. **数据独立性**:数据独立性是数据库设计的一个核心概念,它分为两个级别——逻辑独立性和物理独立性。逻辑独立性意味着应用的逻辑视图不会因底层数据表示的变化而变化;物理独立性则是指用户的应用程序不受存储...

    oracle 10g concepts

    讨论了在多用户环境中,Oracle如何管理和确保数据的并发性和一致性,涉及到锁定机制、事务隔离级别等关键概念。 #### 第十四章:管理性 探讨了Oracle 10g的管理特性,包括性能监控、内存管理、空间管理、备份和...

    sql server 2005_入门到精通

    ### SQL Server 2005 入门到精通——事务管理篇 #### 10.1 商业事务与 SQL Server 事务 每一个商业过程都包含了若干事务,这些事务需要按照预定义的流程来确保每一步骤都能顺利完成。例如,在一个电子商务环境中,...

    数据库基础数据

    本压缩包包含的是关于“数据库基础数据”的内容,特别是针对中国的地理级别划分——城市、省份、学校和区县的数据。接下来,我们将深入探讨MySQL的基础知识以及如何处理这些特定的数据。 1. MySQL基础知识: MySQL...

    java虚拟机并发编程

    - **Executor框架**:Java的Executor框架提供了一种更高级别的并发抽象,通过`ExecutorService`接口和`ThreadPoolExecutor`等类,可以更方便地管理线程池和任务。 #### 三、JVM层面的并发控制 在JVM层面,有多种...

    EF事务死锁测试.rar

    1. **事务的ACID属性**:在讲解死锁之前,我们需要了解事务的四大特性——原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。在死锁中,隔离性显得尤为重要,因为它涉及到...

    PyPI 官网下载 | django-db-locking-2.0.0.tar.gz

    《PyPI官网下载 | django-db-locking-2.0.0.tar.gz——Django数据库锁定机制详解》 在Python的世界中,Django框架是构建Web应用程序的热门选择,其强大的功能和灵活性深受开发者喜爱。然而,随着应用规模的扩大,多...

    Java.Threads.3rd.Edition.txt

    本书详细讨论了死锁的成因及其预防策略,包括遵循良好的锁定习惯、使用定时锁定尝试以及利用工具进行死锁检测等。 ### 七、线程与Swing #### 11.17.1 Swing的线程限制 Swing GUI组件只能在事件分发线程(Event ...

    1_1_Java-面试宝典1(1).docx

    7. 数据库事务:事务是数据库操作的逻辑单元,包含ACID特性——原子性、一致性、隔离性和持久性。要理解事务的四种隔离级别及其可能导致的问题,如脏读、不可重复读、幻读等。 掌握以上知识点,将有助于你在Java...

    2008-2009年上半年数据库系统工程师试题

    1. 并发控制:理解锁定机制(如共享锁、排他锁)和事务隔离级别(读未提交、读已提交、可重复读、串行化),防止并发操作中的数据不一致。 2. 事务:理解事务的基本概念,包括ACID属性(原子性、一致性、隔离性、...

    mysql8.zip

    10. **优化的备份与恢复**:提供了一种新的备份工具——`mysqldumpslow`,用于更有效地处理大规模数据的备份和恢复。 要开始使用这个免安装版本,你需要解压“mysql8.zip”,然后找到“bin”目录,这里包含所有可...

Global site tag (gtag.js) - Google Analytics