`

Thread详解三(高性能的同步)

 
阅读更多
 

Thread详解三(高性能的同步)

分类: 读书笔记之java 287人阅读 评论(0) 收藏 举报

1,java.util.concurrent.locks

Lock对象的作用和隐形锁synchronized作用类似。也是同一时间只能有一个线程获取锁。Lock对象同样支持wait/notify机制,它是通过Condition对象。

Lock和隐形锁比较最大的好处在于可以再尝试获取一个锁的时候即时返回,tryLock方法。如果其他线程在获取锁之前发出了interrupt,lockInterruptibly方法会直接退出。更详细的解释,http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html

 

ReentrantLock是Lock的实现类,应用时要注意的是一定在finally里面释放锁。

 

[java] view plaincopy
 
  1.                   
  2. Lock lock = new ReentrantLock();  
  3. lock.lock();  
  4. try {   
  5.   // update object state  
  6. }  
  7. finally {  
  8.   lock.unlock();   
  9. }  
  10.       

 

什么时候选择用 ReentrantLock 代替 synchronized
既然如此,我们什么时候才应该使用 ReentrantLock 呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用 synchronized 开发,直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。

 

2,并发的容器类

BlockingQueue,这个队列的特殊作用就是可以在往满队列中添加或者空队列中获取的时候提供block或者超时的操作,典型的例子,像生产者和消费者的问题。

ConcurrentMap,这个java.util.Map的子接口定义了一些有用的原子操作,这些操作是线程安全的。包括putIfAbsent,remove,replace,总结来说,就是在集合中没有这个值的时候可以进行添加,集合中有这个值的时候才可以进行替换或者删除。例如remove等价于:

 

[java] view plaincopy
 
  1. if (map.containsKey(key) && map.get(key).equals(value)) {  
  2.    map.remove(key);  
  3.    return true;  
  4. }  
  5. return false;  

 

 

3,原子变量(提升效率)

 

无锁定且无等待算法
如果每个线程在其他线程任意延迟(或甚至失败)时都将持续进行操作,就可以说该算法是 无等待的。与此形成对比的是, 无锁定算法要求仅 某个线程总是执行操作。(无等待的另一种定义是保证每个线程在其有限的步骤中正确计算自己的操作,而不管其他线程的操作、计时、交叉或速度。这一限制可以是系统中线程数的函数;例如,如果有 10 个线程,每个线程都执行一次 CasCounter.increment() 操作,最坏的情况下,每个线程将必须重试最多九次,才能完成增加。)
再过去的 15 年里,人们已经对无等待且无锁定算法(也称为 无阻塞算法)进行了大量研究,许多人通用数据结构已经发现了无阻塞算法。无阻塞算法被广泛用于操作系统和 JVM 级别,进行诸如线程和进程调度等任务。虽然它们的实现比较复杂,但相对于基于锁定的备选算法,它们有许多优点:可以避免优先级倒置和死锁等危险,竞争比较便宜,协调发生在更细的粒度级别,允许更高程度的并行机制等等。

 

所有原子变量类都公开比较并设置原语(与比较并交换类似),这些原语都是使用平台上可用的最快本机结构(比较并交换、加载链接/条件存储,最坏的情况下是旋转锁)来实现的。 java.util.concurrent.atomic 包中提供了原子变量的 9 种风格( AtomicInteger; AtomicLong; AtomicReference; AtomicBoolean;原子整型;长型;引用;及原子标记引用和戳记引用类的数组形式,其原子地更新一对值)。
原子变量类可以认为是 volatile 变量的泛化,它扩展了可变变量的概念,来支持原子条件的比较并设置更新。读取和写入原子变量与读取和写入对可变变量的访问具有相同的存取语义。
虽然原子变量类表面看起来与清单 1 中的 SynchronizedCounter 例子一样,但相似仅是表面的。在表面之下,原子变量的操作会变为平台提供的用于并发访问的硬件原语(处理器直接支持的指令),比如比较并交换。

 

更细粒度意味着更轻量级
调整具有竞争的并发应用程序的可伸缩性的通用技术是降低使用的锁定对象的粒度,希望更多的锁定请求从竞争变为不竞争。从锁定转换为原子变量可以获得相同的结果,通过切换为更细粒度的协调机制,竞争的操作就更少,从而提高了吞吐量。

java.util.concurrent 中的原子变量
无论是直接的还是间接的,几乎 java.util.concurrent 包中的所有类都使用原子变量,而不使用同步。类似 ConcurrentLinkedQueue 的类也使用原子变量直接实现无等待算法,而类似 ConcurrentHashMap 的类使用 ReentrantLock 在需要时进行锁定。然后, ReentrantLock 使用原子变量来维护等待锁定的线程队列。

 

使用同步和原子变量实现线程安全

 

[java] view plaincopy
 
  1.           
  2. public class PseudoRandomUsingSynch implements PseudoRandom {  
  3.     private int seed;  
  4.     public PseudoRandomUsingSynch(int s) { seed = s; }  
  5.     public synchronized int nextInt(int n) {  
  6.         int s = seed;  
  7.         seed = Util.calculateNext(seed);  
  8.         return s % n;  
  9.     }  
  10. }  
  11. public class PseudoRandomUsingAtomic implements PseudoRandom {  
  12.     private final AtomicInteger seed;  
  13.     public PseudoRandomUsingAtomic(int s) {  
  14.         seed = new AtomicInteger(s);  
  15.     }  
  16.     public int nextInt(int n) {  
  17.         for (;;) {  
  18.             int s = seed.get();  
  19.             int nexts = Util.calculateNext(s);  
  20.             if (seed.compareAndSet(s, nexts))  
  21.                 return s % n;  
  22.         }  
  23.     }  
  24. }  
  25.         
效果图可以详见的链接。http://www.ibm.com/developerworks/cn/java/j-jtp11234/index.html

 

大多数用户都不太可能使用原子变量自己开发无阻塞算法 — 他们更可能使用 java.util.concurrent 中提供的版本,如 ConcurrentLinkedQueue。但是万一您想知道对比以前 JDK 中的相类似的功能,这些类的性能是如何改进的,可以使用通过原子变量类公开的细粒度、硬件级别的并发原语。
开发人员可以直接将原子变量用作共享计数器、序号生成器和其他独立共享变量的高性能替代,否则必须通过同步保护这些变量。
    



4,Executors,封装了生成和管理线程的功能。

这些主要应用在线程池中,下一篇再细说。

 

参考:http://docs.oracle.com/javase/tutorial/essential/concurrency/highlevel.html

分享到:
评论

相关推荐

    c# 线程(thread)同步处理

    ### C# 线程(Thread)同步处理详解 在.NET平台上进行多线程编程时,线程同步是一项至关重要的技术。线程同步的主要目的是确保多个线程在访问共享资源时不会产生数据竞争和不一致的情况。本文将详细介绍C#中的几种...

    Java 同步锁(synchronized)详解及实例

    然而,过度使用同步可能导致线程阻塞,降低系统性能。因此,在设计多线程程序时,应尽可能减少同步的范围,只对那些确实需要保护的代码进行同步。 除此之外,Java 5引入了更高级的并发工具类,如`java.util....

    ThreadX内核用户手册,含SMP多核(中文版)新.rar

    ThreadX是一款嵌入式实时操作系统(RTOS),由Express Logic公司开发,现在已经被微软收购并开源。作为一款在工业、航空、医疗等...通过深入学习和实践,开发者能够充分利用ThreadX的优势,实现高性能的嵌入式应用。

    java+多线程+同步详解

    然而,过多的同步可能会导致线程阻塞,影响性能,因此在设计多线程程序时需要权衡同步的粒度和性能。 总之,Java的多线程和同步是构建大规模、高并发应用的关键技术。通过深入理解和熟练运用这些机制,开发者能够...

    threadx user guide

    ThreadX是一款高性能的嵌入式实时操作系统(RTOS),由Express Logic公司开发并拥有。它旨在为嵌入式系统提供高效的多任务处理能力,适用于各种硬件平台,包括微控制器(MCU)和数字信号处理器(DSP)。ThreadX的高...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    C++ boost::asio编程 同步TCP详解及实例代码

    它提供了一个统一的异步调用模型,允许开发人员编写高性能的网络服务器和客户端应用程序。Boost.Asio 支持多种通信协议,包括 TCP、UDP 和 ICMP。 #### 二、同步TCP模式介绍 同步模式是 Boost.Asio 提供的一种简单...

    java多线程详解

    ### Java多线程详解:深度探索Java线程机制 #### 知识点一:线程与进程的区别 在深入探讨Java多线程之前,我们首先需要理解线程与进程的基本概念及其区别。进程是资源分配的基本单位,拥有独立的内存空间,而线程...

    JAVA并发编程实战JAVA并发编程实战JAVA并发编程实战JAVA并发编程实战

    《Nginx高性能Web服务器详解》可能是与Java并发编程实战相关的补充阅读,因为Nginx作为一个高性能的反向代理服务器,经常与Java应用服务器配合使用,优化Web服务的并发处理能力。Nginx的异步非阻塞I/O模型和事件驱动...

    vc++深入详解源代码

    《VC++深入详解源代码》是一本专注于微软Visual C++编程语言深度解析的书籍,它旨在帮助开发者深入了解VC++的内部工作原理以及如何通过源代码理解这些原理。这本书的描述简洁明了,直接指向主题——深入解析VC++的源...

    Java线程详解大全

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应...在实际应用中,根据需求选择合适的线程实现策略,并结合同步机制,可以有效地利用系统资源,提高程序的并发性能。

    Java2编程详解.rar

    9. **多线程**:Java提供了内置的多线程支持,通过Thread类和Runnable接口实现并发执行,理解和掌握线程同步、锁机制对于编写高性能的并发程序至关重要。 10. **网络编程**:Java2平台支持TCP/IP和UDP协议,提供了...

    基于GD32F407和RT-thread 的CHT8305驱动程序详解

    这是一款基于ARM Cortex-M4内核的高性能MCU,具有浮点运算单元(FPU),适用于复杂的嵌入式应用。GD32F407系列提供多种存储器和外设接口选项,使其成为驱动I2C设备如CHT8305的理想选择。 接下来,我们需要熟悉RT-...

    18单服务器高性能模式:PPC与TPC1

    本文主要介绍了两种单服务器高性能模式:PPC(Process Per Connection)和TPC(Thread Per Connection)。这两种模式都是为了有效地管理服务器的连接和请求处理,以达到优化系统性能的目的。 1. PPC(Process Per ...

    java_synchronized详解

    ### Java synchronized 关键字详解 #### 一、synchronized关键字简介 `synchronized`是Java语言提供的关键字之一,主要用于实现线程间的同步控制。通过`synchronized`关键字,可以在多线程环境中确保同一时间只有...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4  高并发编程第三阶段13讲 一个JNI程序的编写,通过Java去调用C,C++程序.mp4  高并发编程第三阶段14讲 Unsafe中的方法使用,一半是...

    C#多线程详解

    ### 三、线程同步与互斥 1. **Mutex**:互斥量用于确保同一时间只有一个线程访问特定资源。 2. **Semaphore**:信号量可以控制同时访问特定资源的线程数量。 3. **Monitor**:监视器是.NET内置的同步机制,通过`...

    VC++深入详解(完整版)+所有源代码集

    VC++提供了创建和管理线程的API,如CreateThread和JoinThread,以及同步机制,如临界区、互斥量和信号量。 6. **异常处理**:C++的异常处理机制是一种处理程序错误的方式,它允许在出现异常情况时中断正常流程,转...

    ThreadX-中文文档

    - **定义**:ThreadX 是一款由 ExpressLogic 公司开发的高性能实时操作系统(RTOS),专门针对嵌入式应用设计。 - **特点**: - 高性能与高响应速度:通过其独特的Picokernel结构实现快速的任务调度与切换。 - 可...

Global site tag (gtag.js) - Google Analytics