`
Tonyguxu
  • 浏览: 271683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Java并发】线程安全

 
阅读更多

什么是线程安全?

当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用方代码不必作其他的协调,这个类的行为仍然是正确的,则称这个类是线程安全的类。

 

无状态的类是线程安全的

如果一个类是无状态的:不包含域也没有引用其他类的域。一次特定计算的瞬时状态会唯一地存在本地变量中,这些本地变量存储在线程的栈中,只有执行线程才能访问。

 

编写线程安全的代码,本质上就是管理对状态 的访问,而且是共享的 /可变的 状态。

关于状态:一个对象的状态就是该对象的数据,存储在状态变量中,如实例域或静态域,还包括附属对象的域。如HashMap的状态一部分存储在对象本身中,同时也存储到很多Map.Entry对象中。

关于共享:一个变量可以被多个线程同时访问。

关于可变:变量的值在其生命周期内可以改变。


只要有多于一个的线程访问给定的状态变量,而且其中某个线程会写入该变量,此时必须使用同步来协调线程对该变量的访问。

Java中首要的同步机制是synchronized关键字,它提供了独占锁。另外,“同步”还包括volatile变量,显示锁和原子变量的使用。


面对一个有多线程访问隐患的程序,可以从以下三个方法来修复:

1.不要使用跨线程的共享变量;

2.使状态变量变为不可变的;

3.在任何访问状态变量的时候使用同步


注意一开始就将一个类设计成是线程安全的,比在后期重新修复更容易,并且并发访问共享状态变量带来的问题往往不好重现。 另外,设计线程安全的类时,要充分利用优秀的面向对象技术——如封装。

 


处理并发程序常见的问题:

1.竞争条件 Race Condition

    a.原子操作问题

自增,自减操作不是原子操作,是读-改-写复合操作,可以用线程安全的原子变量(在java.util.concurrent.atomic包中)来作为计数器。

    b.检查再运行

例如:你观察到一些事情为真(文件x不存在),然后(then)基于你的观察去执行一些动作(创建文件x);事实上,从观察到执行操作的这段时间里,观察结果可能已经失效了(有人在此期间创建了文件x),从而引发错误(非预期的异常,重写数据或者破坏文件)。

再例如惰性初始化。

 

操作共享状态的复合操作必须是原子的,以避免上面的竞争条件,通过对该复合操作加锁 可以确保其行为是原子的。

 

问题:只有在写入共享变量时才需要同步么?

3.1节

 

在java中有哪些保证线程安全的机制或者措施?

锁机制(implicit lockexplicit lock )参见 http://nemogu.iteye.com/blog/1409879




分享到:
评论

相关推荐

    Java 模拟线程并发

    Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发

    Java并发中的线程安全性

    说的是有关JAVA并发中的线程安全性问题

    java多线程并发

    java多线程并发的在新窗口

    Java 并发性和多线程

    Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程

    java 多线程并发实例

    代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!

    Java多线程与并发库高级应用

    并发库高级应用\多线程\Java

    java多线程与高并发视频

    java多线程与高并发java多线程与高并发java多线程与高并发

    Java 并发核心编程

    自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。...开发者通过这些基础的接口可以构建高并发、线程安全的java应用程序。

    java多线程查询数据库

    java多线程并发查询数据库,使用线程池控制分页,并发查询。

    JAVA多线程并发操作全局变量

    NULL 博文链接:https://toknowme.iteye.com/blog/2212529

    java并发编程2

    java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf

    java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    Java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 ...Java线程:并发协作-线程的交互 47 Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58

    JAVA并发编程实践 .pdf

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发...

    超实用的Java并发多线程教程

    超实用的Java并发多线程教程

    JAVA多线程并发编程

    学习并发编程自己总结的知识,非常实用。JAVA学习并发编程的精华

    Java多线程并发实战

    Java多线程并发实战,值得推荐

Global site tag (gtag.js) - Google Analytics