文档章节

Java concurrency in practice笔记 02 03

52iSilence7
 52iSilence7
发布于 2014/06/04 21:22
字数 1064
阅读 35
收藏 0

 什么是线程安全性

        线程安全性的核心是正确性,正确性的含义是如果类的行为与其规范完全一致。因此当多个线程访问某个类时,类的行为始终是安全的,这个类就是线程安全的,这个类也就是一个线程安全类。

        如果一个类没有成员变量,所有的状态都是在线程栈中存储使用的,不会与其他的线程发生数据交互,也就不会出现冲突,这个类是线程安全的。

        如果一个线程要与其他线程共享某个类的变量,这个类需要对共享变量进行同步管理才能保证这个类是线程安全的。

竞态条件(race condition):线程执行结果的正确性取决于执行顺序。

        有check-then-act 和 read-modify-write几种情况,由于操作时非原子性的,这种依赖于以前的结果来进行后续的操作是不安全的,多个线程可能同时check,或有的线程在其他线程check之后act之前对条件进行了修改,就会导致某一次的修改被覆盖,如果用这种方式来生成unique id,就可能导致系统崩溃。

线程安全性有两个方面:原子性和可见性

        上面竞态条件的产生就是因为check-then-act不是原子性操作造成的。可以使用java内置的synchronized关键字加锁,使操作变成原子操作,但是当在有多个共享变量的时候需要注意所有的变量需要持有同一个同步锁,否则会出问题。

        可见性:每个线程执行期间都有自己的线程栈,线程是看不到其他线程的栈内东西的,线程在从主内存读入数据后会在栈内保存一个副本,在线程退出之前会将值写回主内存。这导致的一个问题就是某个线程修改了共享变量的值,另一个线程根据共享变量的值来决定下一步的走向,但是这个线程修改了共享变量的值后对另一个线程是不可见的,这就可能导致另一个线程一直等待。

volatile关键字

        volatile关键字可以保证共享变量的可见性,但不能保证原子性,synchronized关键字两者都能保证。volatile保证线程读到的共享变量的值都是最新的,也就是说volatile修饰的变量是会实时写回主内存中的。volatile提供了比较弱的同步机制,当变量声明为volatile类型后 编译器与运行时会注意到变量是共享的,不会将该变量上的操作与其他内存操作一起重新排序。使用也有限制:对变量的写入操作不能依赖当前值,该变量不会与其他变量一起纳入不变性条件中,在访问变量时不需要加锁。

发布(publish)与逸出(escape)

        发布是指使对象能在当前作用域外的代码中使用,而当 一个不该发布的对象却发布的时候,就产生了逸出。

     下面的get方法就将私有变量泄露出去了,而Secret也被泄露出去,因为可以通过枚举得到每个Secret的实例。  

class Escape{
    private  Set<Secret> set;
    public getSet(){
         return set;
    }
}

        比较难理解的是this逸出,看下面的例子

class ThisEscape{
    ThisEscape(){
       new Thread(new Runnable(){
             public void run(){
                this.s="1";//在类的构造函数还没有完成的时候就调用实例,this就发生了逸出,会产生无                           //法预料的后果
             }
       }).start();
    }
    private String s;
}



        解决办法就是增加一个init()方法,构造函数中只初始化值,不启动线程,需要增加一个内部类和私有变量保存要启动的线程对象。

© 著作权归作者所有

共有 人打赏支持
上一篇: spring BeanFactory
下一篇: Linux 各种$或命令
52iSilence7
粉丝 4
博文 77
码字总数 56798
作品 0
海淀
高级程序员
私信 提问
Java粗浅认识-java简介

简介 java 是1991年是为了交互式电视设计,sun公司在1996年发布java1.0版本,java的特点是“一次编译,到处执行”,借助于 在浏览器上可执行java apple,渐渐流行起来,在1999年发布java1.2...

zoQ
2018/12/14
0
0
Java各阶段学习书目

1. 入门: 高永强的《Java编程艺术》 2. 提高 Bruce Eckel的《Thinking in Java》 3. 进阶 Joshua Bloch的《Effective Java》 Joshua Bloch的《Java Puzzlers》 4. 全面 Cay S. Horstman的《...

晨曦之光
2012/04/24
127
0
111 多线程JUC包下代码分析

Java多线程系列目录(共43篇) AtomicLongFieldUpdater:通过反射+CAS实现对传入对象的指定long字段实现类似AtomicLong的操作 http://www.cnblogs.com/skywang12345/p/javathreadscategory.ht...

素雷
2017/10/31
0
0
读《深入理解Java虚拟机》- 笔记08

《深入理解Java虚拟机:JVM高级特性与最佳实践》第2版 第10章 早期(编译期)优化 59. 语法糖 在计算机语言中添加某种语法,对语言的功能没有影响,但是方便开发人员使用。 泛型是一种语法糖...

阿历Ali
2018/08/18
0
0
Java 书籍 Top 10

陈皓 http:// blog.csdn.net/haoel 下面是Java Inside上推荐的十本Java书籍(文章来源),我把中文版的也列了出来。 1)Java Language Specification, Third Edition (by James Gosling) 本书...

JavaGG
2009/09/21
12.5K
20

没有更多内容

加载失败,请刷新页面

加载更多

深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
30分钟前
1
0
MVC、MVCS、MVVM、MVP、VIPER等这么多架构模式哪一个好呢?

在项目开启阶段,其中一个很重要的环节就是选架构。 那么面对目前已知的这么多架构模式我们该怎么选择呢?这确实是个很让人头疼的问题! 下面我就在这里梳理一下目前常见的一些架构模式。 先...

Java干货分享
今天
4
0
简单模仿配置文件的反射机制

//Student类 public class Student { public void love() { System.out.println("python"); } } //Tesy类 public class Tesy { public static void main(String[] args) throws Exceptio......

南桥北木
今天
2
0
你真的需要了解一下CSS变量 var()的用法

当Web项目变得越来越大时,他的CSS会变得像天文数字那么大而且还变得混乱。为了帮助我们解决这个问题,新的CSS变量很快就会出现在主流浏览器中,它让开发人员能够重用并轻松编辑重复出现的C...

前端小攻略
今天
1
0
嵌入式应用选择合适的微控制器

为嵌入式应用选择微控制器有几个原因,即低成本,高集成度,增加可靠性,节省空间等。 准备所需硬件接口列表使用微控制器的基本硬件框图,准备一份微控制器需要支持的所有外设接口的列表。微...

linux-tao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部