ThreadA__________     同步    ______________

     异步    ___________     异步

ThreadB__________              ______________

后台进程 : 程序结束 ,则后台进程随之结束。

多个线程都可能访问,有共享,就要考虑线程安全。

Timer : 开启新线程,  timerTask 如果访问程序中的数据,那么该数据的访问需要是线程安全的,简单方法:将线程安全封装在共享数据内部。timer:AtFixed是从上次开始时间算起。不加   AtFixed,若执行时间更长,则是从上次结束时间算起。

Servlet 是单例的,可能被多个线程调用,servlet是共享数据,本身需要线程安全。

(第二章)线程安全:正确性

线程安全类中封装了必要的同步机制,因此客户端无须进一步采取同步措施。

局部变量存在于线程栈,只有执行线程可以访问,状态对象存在于堆中,线程之间可以共享。

线程安全性:多个线程之间的操作无论采用何种执行时序或交替方式,都要保证不变性条件不被破坏

无状态: 自身不包含域,也不包含对其他类中域的引用。

无状态对象是线程安全的。

2.1原子性

竞态条件:操作时序会影响结果的正确性。

1. 读取--修改--写入

有状态:count

++count :     1.获取count  2.count+1  3.赋值给count

2.先检查后执行 :延迟初始化

3.使用现有的线程安全类:AtomicLong 确保操作的原子性

4. 但是若有多个状态值,尽管是线程安全类,结果也并不一定正确。

要保证状态的一致性,就要在单个原子操作中更新所有相关的状态变量。

2.3加锁机制

1.内置锁

synchronized 同步方法锁:当前对象,静态同步方法 锁:当前类。

同步代码块互斥,只有一个线程可以访问,但是性能就可能低。

2.重入

内置锁是可以重入的。重入意味获取锁的粒度是“线程”,而不是“调用”。

重入的一种实现方法是,为每个锁关联一个获取 计数值和一个所有者线程。

内置锁重入避免了以下线程的死锁。

2.4活跃性和性能

合理处理加锁代码块。

当执行时间较长的计算或者无法快速完成的 操作时(网络io,控制台io),千万不要持有锁。

java并发编程实战笔记---(第二章)线程安全:正确性的更多相关文章

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

    一.什么是线程安全性 编写线程安全的代码 核心在于要对状态訪问操作进行管理. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与 ...

  2. java并发编程实战:第二章----线程安全性

    一个对象是否需要是线程安全的取决于它是否被多个线程访问. 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错.解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问 ...

  3. 《Java并发编程实战》第二章 线程安全 札记

    一个.什么是线程安全 编写线程安全的代码 其核心是管理国事访问的操作. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范 ...

  4. JAVA并发编程实战笔记 第二章

    2.1 线程安全性 当多个线程访问某个类时,不论这些线程如何交替执行,这个类始终都能表现出正确的行为,且主调代码中不需要任何额外的同步或协同,则称这个类是线程安全的. 类不变性条件(Invariant ...

  5. Java并发编程实战 第8章 线程池的使用

    合理的控制线程池的大小: 下面内容来自网络.不过跟作者说的一致.不想自己敲了.留个记录. 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务.IO ...

  6. Java并发编程实战 第2章 线程安全性

    编写线程安全的 代码,核心在与对共享的和可变的对象的状态的访问. 如果多个线程访问一个可变的对象时没有使用同步,那么就会出现错误.在这种情况下,有3中方式可以修复这个问题: 不在线程之间共享该状态变量 ...

  7. 【java并发编程实战】第二章:对象的共享

    1.重要的属性 可见性,不变性,原子性 1.1可见性 当一个线程修改某个对象状态的时候,我们希望其他线程也能看到发生后的变化. 在没有同步的情况下,编译器和处理器会对代码的执行顺序进行重排.以提高效率 ...

  8. Java并发编程实战.笔记十一(非阻塞同步机制)

    关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...

  9. Java并发编程实战---第六章:任务执行

    废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...

  10. Java并发编程实战 第16章 Java内存模型

    什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...

随机推荐

  1. 自动化测试常用断言的使用方法(python)

    自动化测试中寻找元素并进行操作,如果在元素好找的情况下,相信大家都可以较熟练地编写用例脚本了,但光进行操作可能还不够,有时候也需要对预期结果进行判断. 这里介绍几个常用断言的使用方法,可以一定程度上帮 ...

  2. 洛谷P1991 无线通讯网

    P1991 无线通讯网 170通过 539提交 题目提供者洛谷OnlineJudge 标签图论 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 怎么又炸了 为啥一直40!求解! UKE:inv ...

  3. Nginx多个配置文件共用location配置

    一.应用情况 很多时候我们在一台服务器上部署了不止 一个项目,我们通过Nginx来代理,为了方便管理往往会将各个项目的配置分开写到不同的配置文件中,如: 在nginx.conf 文件中加上  incl ...

  4. js返回上一页的实现方法

    下面是常用代码: <a href="<a href="javascript :history.back(-1)">返回上一页</a> < ...

  5. 使用tqdm组件构造程序进度条

    使用tqdm组件构造程序进度条 觉得有用的话,欢迎一起讨论相互学习~Follow Me 主要代码 import tqdm # 引用tqdm组件 TRAIN_STEPS = N for i in tqd ...

  6. Linux高级编程--04.GDB调试程序(入门概述)

    GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试 ...

  7. 使用itextpdf提取pdf内容

    package test; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList ...

  8. 搭建Elasticsearch5.6.8 分布式集群

    集群搭建 1.master[192.168.101.175] 配置elasticsearch.yml #集群名称 所有节点要相同 cluster.name: my-application #本节点名称 ...

  9. 提高效率!15款最好的 Bug 跟踪应用程序

    当涉及到开发项目时,其中比较重要的事情是它需要某​​种形式的错误和问题跟踪工具来发现和解决问题,否则会浪费大量的时间. 此外,你总是要标签应用来标示那些悬而未决的问题,而这种分期执行的项目进度将帮助您 ...

  10. Yii2 的 redis 应用

    在应用的时候需要先对yii2进行扩展安装 如果装有composer直接运行 php composer.phar require --prefer-dist yiisoft/yii2-redis 当然也 ...