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. Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体

    在Unity Editor下,当选择Camera组件后,可呈现出Camera视口区域锥体,非常方便.但是当选择其他物体,如Cube后,就无法得知是否在Camera市口区内了,这里我找到了雨松MOMO的 ...

  2. bzoj3884: 上帝与集合的正确用法(数论)

    感觉是今天洛谷月赛T3的弱化版,会写洛谷T3之后这题一眼就会写了... 还是欧拉扩展定理 于是就在指数上递归%phi(p)+phi(p)直到1,则后面的指数就都没用了,这时候返回,边回溯边快速幂.因为 ...

  3. 小程序navigatorTo缺点和修正方法

    1.不好带参数跳转到tabbar,即下部的导航栏目. reLauntch方法可以传递参数到导航栏目: go_to_prolist: function (e) { var datatype = e.cu ...

  4. linux shell学习一

    本博客参考自: http://www.cnblogs.com/waitig/p/5523409.html <shell从入门到精通>  张春晓编著 Shell简介 Shell自身是一个用C ...

  5. uva 1636 Headshot

    https://vjudge.net/problem/UVA-1636 首先在手枪里随机装一些子弹,然后抠了一枪,发现没有子弹.你希望下一枪也没有子弹,是应该直接再抠一枪(输出SHOOT)呢,还是随机 ...

  6. Python学习笔记(三十三)常用内置模块(2)collections_namedtuple_deque_defaultdict_OrderedDict_Counter

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431953239 ...

  7. 大数mod的技巧

    1.mod 3 将各个位上的数字相加对3求余. 2.mod 11 设这个数为abcdefghijklmnopqrst. ans=(t-s+r-q+p-o+n-m+l-k+j-i(以此类推))mod 1 ...

  8. PHPMailer发送邮件(一)

    Github 地址:(已更新,适用于旧版) PHPMailer : https://github.com/PHPMailer/PHPMailer 一.基本要求 Web访问正常(apache可以正常访问 ...

  9. Java后台开发面试题总结

    1>如何定位线上服务OOM问题 2>JVM的GC ROOTS存在于那些地方 3>mysql innodb怎样做查询优化 4>java cas的概念 Java服务OOM,比较常见 ...

  10. IE9 下 ellipsis bug fix

    fiddle: http://jsfiddle.net/tagliala/TtbuG/10/ original: https://github.com/FortAwesome/Font-Awesome ...