《Java并发编程实战》第二章 线程安全性 读书笔记

一、什么是线程安全性

编写线程安全的代码

核心在于要对状态访问操作进行管理。

共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变.

线程安全性

核心概念是正确性。某个类的行为与其规范完全一致。

多个线程同时操作共享的变量,造成线程安全性问题。

* 编写线程安全性代码的三种方法:

不在线程之间共享该状态变量

将状态变量修改为不可变的变量

在访问状态变量时使用同步

Java同步机制工具:

synchronized

volatile类型变量

显示锁(Explicit Lock )

原子变量

二、1 原子性

原子性

不可再分的操作。

例如:读,原子操作,写原子操作.

改变变量的值,非原子操作,因为涉及读,改,写

线程安全需要考虑的因素:

对象状态 - 什么叫有状态和无状态?无状态对象肯定是线性安全的?

复合操作 - 操作有多个步骤完成的操作 (例如, 先检测后执行, 变量的操作都分类三步 : 读取  - 修改  - 写入. )

竞态条件

先检测后执行

延迟初始化竞态条件(单例, 调用方法时才返回对象)

** 待添加实例解释原子性

二、2 线程安全解决办法

2.3  加锁机制

遇到问题 - 可以保证每个变量都是线程安全的,但是如果一个方法中同时有多个变量,必须保证变量同步更新才算线程安全。

多个变量时需要加同一个锁,保证多个变量同时更新。

2.4 用锁来保护状态

通常认为只有写入的时候才需要锁,但如果读取的时候值值不能确保是否有其他现在正在修改或者以修改,同样会遇到问题。

2.5 *** 活跃性与性能

活跃性问题?

例如: 线程A等待线程B释放其持有的资源

性能问题?

例如: 线程切换过于频繁,CPU在线程调度上花费资源过多

*** 新的文章中总结锁相关知识与问题

思考

可能出现线程安全的地方?

变量相关

方法操作变量

情况:

多个线程访问一个变量

多个线程访问多个变量

多个线程访问多个方法,同时操作一个变量

多个线程访问多个方法,同时操作多个变量

2014-05-24  发文

《Java并发编程实战》第二章 线程安全性 读书笔记

时间: 2024-12-24 17:22:22

《Java并发编程实战》第二章 线程安全性 读书笔记的相关文章

JAVA并发编程实战---第二章:线程安全性

对象的状态是指存储在状态变量中的数据.对象的状态可能包括其他依赖对象的域.例如HashMap的状态不仅存储在HashMap本身,还存储在许多Map.Entry对象中.对象的状态中包含了任何可能影响其外部可见性为的数据. 共享意味着变量可以由多个线程同时访问,可变意味着变量的值在其生命周期内可能发生变化. 线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么这个类就是线程安全的. 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这写线程将如何交替执行,并且在主调代码中

java并发编程实战手册(一)线程管理

本文主要是以知识点的形式对java多线程进行了解,学习java多线程的基础,本文参考书籍<java并发编程实战手册>,若有兴趣想研究跟高级的多线程思想,可以阅读<java并发编程实战>. 1.线程的创建和运行 java线程的创建有三种方式,可能大部分人只知道常用的两种: 1.继承Thread类,并且覆盖run()方法. 2.创建一个实现Runnable接口的类.使用带参数的Thread构造器来创建Thread对象. 3.使用Callable与Future来创建启动线程 1.创建Ca

[Java Concurrency in Practice]第二章 线程安全性

线程安全性 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享和可变的状态的访问. 对象的状态是指存储在状态变量(例如实例或静态域)中的数据.对象的状态可能包括在其他依赖对象的域.例如,某个HashMap的状态不仅存储在HashMap对象本身,还存储在许过Map.Entry对象中.在对象的状态中包含了任何可能影响其外部可见行为的数据. "共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化. 一个对象是否需

java并发编程实战第一章

线程不安全代码测试 private static class UnsafeSequence { private int value; public int getNext() { return value++; } } 使用两个线程分别调用上面的getNext方法1000次,出现了一次线程不安全的情况,在转出的结果中有两个1311: 图片.png 原因分析,与书上说的一致: 图片.png 完整的代码 import java.io.PrintWriter; import java.util.con

【java并发编程实战】-----线程基本概念

学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习Java并发编程,共同进步,互相指导. 在学习Java并发之前我们需要先理解一些基本的概念:共享.可变.线程安全性.线程同步.原子性.可见性.有序性. 共享和可变 要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问. "共享"就意味着变量可以被多个线程同时访问.我们知道系统中的资

《Java并发变成实践》读书笔记---第二章 线程安全性

什么是线程安全性 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问.从非正式的意义上来说,对象的状态是指存储在状态变量(例如实例或静态域)中的数据."共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化.所以编写线程安全的代码更侧重于如何防止在数据上发生不受控的并发访问. 如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误

读书笔记-----Java并发编程实战(一)线程安全性

线程安全类:在线程安全类中封装了必要的同步机制,客户端无须进一步采取同步措施 示例:一个无状态的Servlet 1 @ThreadSafe 2 public class StatelessFactorizer implements Servlet{ 3 public void service(ServletRequest req,ServletResponse resp){ 4 BigInteger i = extractFromRequest(req); 5 BigInteger[] fact

《Java并发编程实战》第十六章 Java内存模型 读书笔记

Java内存模型是保障多线程安全的根基,这里仅仅是认识型的理解总结并未深入研究. 一.什么是内存模型,为什么需要它 Java内存模型(Java Memory Model)并发相关的安全发布,同步策略的规范.一致性等都来自于JMM. 1 平台的内存模型 在架构定义的内存模型中将告诉应用程序可以从内存系统中获得怎样的保证,此外还定义了一些特殊的指令(称为内存栅栏或栅栏),当需要共享数据时,这些指令就能实现额外的存储协调保证. JVM通过在适当的位置上插入内存栅栏来屏蔽在JVM与底层平台内存模型之间的

《Java并发编程实战》第三章 对象的共享 读书笔记

一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见性的描写叙述即多线程能够实时获取其它线程改动后的状态. *** 待补充   两个工人同一时候记录生产产品总数问题 1. 失效数据 可见性出现故障就是其它线程没有获取到改动后的状态,更直观的描写叙述就是其它线程获取到的数据是失效数据. 2. 非原子64位操作 3. 加锁与可见性 比如在一个变量的读取与