在这篇文章里面已经提到了三件事情:1、Peterson 算法,2、ConcurrentHashMap,3、无锁编程的初识。
如果站在语言层面之上,仅从设计的层面看,可以避免锁的思路至少包括:
1、单线程来主导行为,多线程池化操作避开状态变量。
比如在一个WEB应用中,每一个Action都可以给相应的用户线程分配一个实例,线程之间互不干扰;但是到了业务逻辑Service内,避开Service状态变量的使用,减少了开发人员对并发编程的关注。
2、函数式编码。
函数式编码是最天然的和最高效的免锁方式,如果你对函数式编码还不了解,请参看这篇文章。
3、资源局部复制、异步处理。
总所周知对资源的争夺是造成锁的一个重要原因,在很多情况下,资源只能有一份,但是对使用资源的每个线程来说,都可以看到属于它自己的一份(这一份并非是真正的资源,很可能只是一个缓冲区,每个线程使用它自己的一个缓冲区,到一定程度时将缓冲区的数据处理到唯一资源中,这就减少了需要加锁对线程的影响),无需考虑并发地去使用。
Java的锁操作和锁优化:
锁自旋
线程要进入阻塞状态,肯定需要调用操作系统的函数来完成从用户态进入内核态的过程,这一步通常是性能低下的。
那么在遇到锁的争用时,或许等待线程可以不那么着急进入阻塞状态,而是等一等,看看锁是不是马上就释放了,这就是锁自旋。锁自旋在多处理器上有重要价值。
当然锁自旋也带来了一些问题,比如如何判断自旋周期,如何确定自旋锁的个数,如何处理线程优先级差异等。
锁偏向
锁偏向是JDK1.6引入的,主要为了解决在没有竞争情况下锁的性能问题。
锁都是可重入的,在已经获得锁的情况下,该线程可以多次锁住该对象,但是每次执行这样的操作会因为CAS(CPU的Compare-And-Swap指令)操作而造成一些开销,为了减少这种开销,这个锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他的线程获取,则持有偏向锁的线程将永远不需要再进行同步。
锁消除
(JDK1.6)锁削除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行削除。
锁膨胀
(JDK1.6)和数据库中的锁升级有些相似,多个或多次调用粒度太小的锁,进行加锁解锁的消耗,反而还不如一次大粒度的锁调用来得高效,因此JVM可将锁的范围优化到更大的区域。
轻量级锁
(JDK1.6)轻量级锁能提升程序同步性能的依据是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。轻量级锁在当前线程的栈帧中建立一个名为锁记录的空间,用于存储锁对象目前的指向和状态。如果没有竞争,轻量级锁使用CAS操作避免了使用互斥量的开销,但如果存在锁竞争,除了互斥量的开销外,还额外发生了CAS操作,因此在有竞争的情况下,轻量级锁会比传统的重量级锁更慢。
分享到:
相关推荐
在Java中,JDK提供了一系列无锁类来简化无锁编程的复杂性。这些类包括AtomicInteger、AtomicLong、AtomicReference等,它们都是通过底层的CAS操作来实现无锁线程安全访问的。例如,AtomicInteger类提供了如compare...
- **无锁编程**:探讨无锁编程的基本原理和技术细节,包括使用原子变量进行并发控制的方法。 - **并发集合**:详细介绍Java提供的各种并发集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,并讨论它们适用...
8. **原子操作类**:`java.util.concurrent.atomic`包下的原子类如`AtomicInteger`、`AtomicReference`等,提供了一种无锁编程的方式,通过CAS(Compare and Swap)操作来更新变量,保证了操作的原子性。 9. **死锁...
6. **原子操作与CAS**:Atomic类提供了一种无锁编程的方式,利用硬件级别的比较并交换(Compare and Swap, CAS)操作实现原子性更新,以提高并发性能。 7. **线程池设计**:线程池可以有效管理并发线程,避免频繁...
7. **原子操作**:介绍`java.util.concurrent.atomic`包下的原子类,它们提供了一种无锁编程的方式。 8. **线程池**:探讨线程池的工作原理和最佳实践,如`ThreadPoolExecutor`的配置和使用。 接下来,转向网络高级...
- **减少锁的竞争**:使用细粒度锁或无锁编程。 - **减少上下文切换**:合理使用线程池,减少线程创建的数量。 ### 六、并发工具类与实用技巧 #### 6.1 CyclicBarrier与CountDownLatch - **CyclicBarrier**:可以...
2. **同步机制**:讲解Java中为避免线程竞态条件而采用的各种同步机制,如synchronized关键字(包括对象锁和类锁)、volatile变量、Lock接口(如ReentrantLock)及其相关工具类。 3. **并发工具类**:介绍Java并...
Java并发编程实践.pdf 本文档讲述了Java并发编程实践,特别是使用开源软件...本文档讲述了使用Amino构建并发应用程序的实践经验,包括Amino的简介、Amino在Java中的应用、无锁数据结构和使用Amino的优点等方面的内容。
5. **原子操作与Atomic类**:探讨了Java中的原子操作和Atomic类,它们提供了一种无锁编程的方式,保证了在并发环境下的数据一致性。 6. **线程池**:讲解Executor框架,包括ThreadPoolExecutor、...
6. **原子变量(Atomic Variables)**:介绍了AtomicInteger、AtomicLong等原子类,它们提供了一种无锁的并发编程方式,可以在不使用锁的情况下保证数据的一致性。 7. **并发工具类**:包括ExecutorService、Future...
6. 原子操作与无锁编程:介绍了如何使用Atomic类以及CAS(Compare-And-Swap)等无锁技术来提高并发性能。 7. 并发设计模式:例如生产者-消费者模式、读写锁模式、线程池模式等,这些都是多线程程序设计中常用的设计...
为了克服这些困难,作者们在第一章中探讨了多种解决方案和技术,比如使用同步机制、锁优化策略以及无锁编程技术等。通过详细介绍这些问题的本质原因及其解决方案,帮助读者建立扎实的基础,以便更好地理解后续章节的...
4. **原子操作与CAS**:`java.util.concurrent.atomic`包中的原子变量类如`AtomicInteger`提供了无锁编程的能力。比较和交换(CAS)操作是其底层实现的关键,理解CAS的工作原理可以帮助你编写更高效的并发代码。 5....
1. **无锁编程**:无锁编程是一种并发控制技术,通过原子操作避免使用锁来同步共享数据,从而减少线程上下文切换和竞争条件,提高并发性能。 2. **Java进程间通信(IPC)**:在Java中,IPC可以通过多种方式实现,如...
6. **线程池**:线程池是Java并发编程中的一种重要优化手段,能够有效管理线程资源,防止过度创建和销毁线程带来的开销。书中介绍了如何定制和使用线程池,以及其背后的调度策略。 7. **原子操作与CAS**:Atomic类...
为了简化和抽象这些底层操作,Java 1.5以后引入了`java.util.concurrent.atomic`包,包含如`AtomicInteger`、`AtomicLong`等类,它们提供了原子化的整型和长整型操作,使得开发者可以更方便地实现无锁编程。...
《Java并发编程实践》这本书是Java开发者深入了解并发编程的重要参考资料,尤其对于想要提升在多线程环境下编程技能的程序员来说,它提供了丰富的实践经验和深入的理论解析。在Java的世界里,多线程是构建高性能、高...
6. **原子类与并发流**:讲解java.util.concurrent.atomic包下的原子类,它们提供了一种无锁编程的方式。同时,还会涉及Java 8引入的并发流(Parallel Streams),如何利用流API进行并行处理。 7. **实战案例**:...
7. **并发工具类**:`java.util.concurrent`包包含了许多并发工具类,如`AtomicInteger`、`AtomicLong`等原子类,它们提供了无锁编程的支持。 8. **死锁、活锁和饥饿**:并发编程中可能出现的三种状态,死锁是两个...
在Java编程中,并发处理是优化性能、提高系统资源利用率的关键手段,尤其是在多核处理器和分布式系统中更为重要。下面将详细阐述Java并发编程中的核心知识点。 1. **线程与进程**:线程是程序执行的基本单位,而...