摘要:线程封闭当访问共享的可变数据时,通常需要使用同步。如果仅在单线程内访问数据,就不要同步。这种技术成为线程封闭。栈封闭栈封闭是线程封闭的一种特例,在栈封闭中,只能通过局部变量才能访问对象。,对象是正确创建的。
线程封闭
当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不要同步。这种技术成为线程封闭(Thread Confinement)。Ad-hoc 线程封闭
Ad-hoc 线程封闭是指维护线程封闭的职责完全是由程序自己来承担。栈封闭
栈封闭是线程封闭的一种特例,在栈封闭中,只能通过局部变量才能访问对象。ThreadLocal类
ThreadLocal提供了set和get等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回由当前执行线程在调用set设置的最新值。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * ConnectionDispenser * * Using ThreadLocal to ensure thread confinement * * @author Brian Goetz and Tim Peierls */ public class ConnectionDispenser { static String DB_URL = "jdbc:mysql://localhost/mydatabase"; private ThreadLocal不变性connectionHolder = new ThreadLocal () { public Connection initialValue() { try { return DriverManager.getConnection(DB_URL); } catch (SQLException e) { throw new RuntimeException("Unable to acquire Connection, e"); } }; }; public Connection getConnection() { return connectionHolder.get(); } }
满足同步需求的另一种方法是使用不可变对象。1,对象创建以后其状态就不能修改。2,对象的所有域都是final类型。3,对象是正确创建的。
Final域关键字final可以视为C++中const机制的一种受限版本,用于构造不可变对象。 (引用不可变,引用的对象是可变的)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74403.html
摘要:对象的组合介绍一些组合模式,这些模式能够使一个类更容易成为线程安全的,并且维护这些类时不会无意破坏类的安全性保证。状态变量的所有者将决定采用何种加锁协议来维持变量状态的完整性。所有权意味着控制权。 对象的组合 介绍一些组合模式,这些模式能够使一个类更容易成为线程安全的,并且维护这些类时不会无意破坏类的安全性保证。 设计线程安全的类 在设计线程安全类的过程中,需要包含以下三个基本要素: ...
摘要:无状态的是线程安全的,当无状态变为有状态时就是不安全的破坏了线程的安全性,非原子性操作竞态条件在并发编程中,由于不恰当的执行时序而出现的不正确结果是一种非常重要的情况,被称之为竞态条件。重入意味着获取锁的操作的粒度是线程,而不是调用。 这本书的内容是什么? 本书提供了各种实用的设计规则,用于帮助开发人员创建安全的和高性能的并发类。 什么类是线程安全的? 当多个线程访问某...
摘要:对象的共享上一章介绍了如何通过同步来避免多个线程在同一时刻访问相同的数据,而本章将介绍如何共享和发布对象,从而使它们能够安全地由多个线程同时访问。为了确保多个线程的之间对内存写入操作的可见性,必须使用同步机制。 对象的共享 上一章介绍了如何通过同步来避免多个线程在同一时刻访问相同的数据,而本章将介绍如何共享和发布对象,从而使它们能够安全地由多个线程同时访问。 列同步代码块和同步方法可...
摘要:上集算法实现的优点当一个线程执行任务失败不影响其他线程的进行最大限度的利用资源能提高程序的伸缩性伸缩性不修改任何代码升级硬件就能带来性能上的提高升级硬件带来的性能提高明显就是伸缩性良好的缺点代码复杂影响阅读性刚开始看的时候没有正确的思路理解 ConcurrentLinkedQueue(上集) 算法实现 CAS CAS的优点 当一个线程执行任务失败不影响其他线程的进行 最大限度的利用...
摘要:过程是一个计算单元,计算是通过通讯来完成的。标题的表达式里还有一个符号,表示一个无行为的过程。一个过程的是它和外部产生行为交互的唯一方式。所以如果两个过程需要通过一个交互,这个必须在两个过程中都是,其中一方用于发送,另一方用于接收。 这篇文章的标题是一个π表达式,结尾是一段JavaScript代码,和这个表达式的含义完全一致,或者说,完成了这个表达式的估值。 π演算(π calculu...
阅读 2960·2021-11-23 09:51
阅读 2766·2021-11-11 16:55
阅读 2827·2021-10-14 09:43
阅读 1376·2021-09-23 11:22
阅读 1018·2019-08-30 11:04
阅读 1637·2019-08-29 11:10
阅读 930·2019-08-27 10:56
阅读 3079·2019-08-26 12:01