一、什么是线程安全性

编写线程安全的代码

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

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



线程安全性
核心概念是正确性。某个类的行为与其规范全然一致。
多个线程同一时候操作共享的变量,造成线程安全性问题。





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

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

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

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



Java同步机制工具:

     synchronized

     volatile类型变量

     显示锁(Explicit Lock )

     原子变量

二、1 原子性

原子性 
不可再分的操作。
比如:读,原子操作,写原子操作.  
改变变量的值,非原子操作,由于涉及读,改,写

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

     对象状态 - 什么叫有状态和无状态?

无状态对象肯定是线性安全的?

     复合操作 - 操作有多个步骤完毕的操作 (比如, 先检測后运行, 变量的操作都分类三步 : 读取  - 改动  - 写入. )

     竞态条件

           先检測后运行

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


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

二、2 线程安全解决的方法

2.3  加锁机制

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

多个变量时须要加同一个锁。保证多个变量同一时候更新。



2.4 用锁来保护状态

通常觉得仅仅有写入的时候才须要锁,但假设读取的时候值值不能确保是否有其它如今正在改动或者以改动,相同会遇到问题。





2.5 *** 活跃性与性能



活跃性问题?

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



性能问题?

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





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





思考

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

变量相关

方法操作变量





情况:

多个线程訪问一个变量

多个线程訪问多个变量

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

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



2014-05-24  发文

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

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

    对象的状态是指存储在状态变量中的数据.对象的状态可能包括其他依赖对象的域.例如HashMap的状态不仅存储在HashMap本身,还存储在许多Map.Entry对象中.对象的状态中包含了任何可能影响其外 ...

  2. Java并发编程实战4章

    第4章主要介绍如何构造线程安全类. 在设计线程安全类的过程中,需要包含以下三个基本要素: 找出构成对象状态的所有变量. 找出约束状态变量的不变性条件. 建立对象状态的并发访问管理策略. 构造线程安全类 ...

  3. java并发编程实战《七》安全性、活跃性以及性能问题

    安全性.活跃性以及性能问题 安全性问题 那什么是线程安全呢?其实本质上就是正确性,而正确性的含义就是程序按照我们期望的执行,不要让我们感到意外. 存在共享数据并且该数据会发生变化,通俗地讲就是有多个线 ...

  4. Java并发编程实战3章

    1.同步包括两方面:原子性和可见性. 2.可见性:因为在多线程程序中,如果没有采用正确的同步,有些线程就会得到失效数据. Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非vol ...

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

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

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

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

  7. 《Java并发编程实战》/童云兰译【PDF】下载

    <Java并发编程实战>/童云兰译[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062521 内容简介 本书深入浅出地介绍了Jav ...

  8. 《java并发编程实战》笔记

    <java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为:  Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...

  9. [书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型

    本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解J ...

随机推荐

  1. zoj 2376 Ants

    #include<stdio.h> #include<stdlib.h> ]; int main(void) { int t,n,m,i,len,max,min,mx,mi; ...

  2. CSS hank

    CSS hank CSS hank是为了让CSS代码兼容不同浏览器,也可以通过CSS hank为不同的浏览器设置不同的CSS样式. CSS hank的3种表现形式: 类内部hank IE6能识别下划线 ...

  3. Bootstrap第一天

    1.代码引入: 第一步:在html5文档 <meta name="viewport" content="width=device-width, initial-sc ...

  4. ThinkPHP第十七天(隐藏index.php和简短路径配置)

    1.路由设置,让路径中不显示index.php方法: 第一步:在apache中的httpd.conf中查找: LoadModule rewrite_module modules/mod_rewrite ...

  5. Linux中fork()函数详解(转载)

    [原创地址]http://blog.csdn.net/jason314/article/details/5640969 [转载地址]http://www.cnblogs.com/bastard/arc ...

  6. Bootstrap Collapse使用

    参考 http://wrongwaycn.github.io/bootstrap/docs/javascript.html#collapse http://www.w3resource.com/twi ...

  7. Xamarin几十篇博客,roslyn和dotnet也开源了

    .Net 基金会 http://www.dotnetfoundation.org/ 更新的真快,刚打完2的补丁包,3就粗来了............ https://www.visualstudio. ...

  8. Delphi的MDI编程中遇到的一个奇怪问题(值得研究的一个问题)

    近日在用delphi写一个多文档应用程序,除了一个主界面是自动生成的,其他功能页面全部都是通过Application.CreateForm()动态生成的,也就是说在ProjectManager中点击程 ...

  9. Create screenshots of a web page using Python and QtWebKit | Roland's Blog

    Create screenshots of a web page using Python and QtWebKit | Roland's Blog Create screenshots of a w ...

  10. java代码发送JSON格式的httpPOST请求

    package com.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOE ...