`

java 线程安全总结

 
阅读更多
java的多线程并发问题最终都会反映在java的内存模型上,
所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。
java内存模型主要分为可见性和有序性
1.可见性:
多个线程之间是不能互相传递数据通信的,它们之间的沟通只能通过共享变量来进行。
Java内存模型(JMM)规定了jvm有主内存,主内存是多个线程共享的。new一个对象时会被分配在主内存中,
每个线程都有自己的工作内存,工作内存存储了主内存的某些对象的副本,
当然线程的工作内存大小是有限制的。当线程操作某个对象时,执行顺序如下:
 (1) 从主存复制变量到当前工作内存(read and load)
 (2) 执行代码,改变共享变量值(use and assign)
 (3) 用工作内存数据刷新主存相关内容(store and write)
 当一个共享变量在多个线程的工作内存中都有副本时,如果一个线程修改了这个共享变量,
 那么其他线程应该能够看到这个被修改后的值,这就是多线程的可见性问题。

 2.有序性
 线程在引用变量时不能直接从主内存中引用,如果线程工作内存中没有该变量,
 则会从主内存中拷贝一个副本到工作内存中,这个过程为read-load,完成后线程会引用该副本。
 当同一线程再度引用该字段时,有可能重新从主存中获取变量副本(read-load-use),
 也有可能直接引用原来的副本(use),也就是说read,load,use顺序可以由JVM实现系统决定。
 线程不能直接为主存中中字段赋值,它会将值指定给工作内存中的变量副本(assign),
 完成后这个变量副本会同步到主存储区(store-write),至于何时同步过去,根据JVM实现系统决定,这就
 造成了线程安全问题

 java线程安全解决方法
 一.使用synchronized
 synchronized关键字的作用域有二种:
 同步加锁的是对象,而不是代码
1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法
(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,
其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。
也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 
2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。
它可以对类的所有对象实例起作用。

2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,
表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;

3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){
} 在继承类中并不自动是synchronized f(){},
而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,
它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用.
参考:
http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html
二。

volatile是java提供的一种同步手段,只不过它是轻量级的同步,
为什么这么说,因为volatile只能保证多线程的内存可见性,
不能保证多线程的执行有序性。而最彻底的同步要保证有序性和可见性,
例如synchronized。任何被volatile修饰的变量,都不拷贝副本到工作内存,
任何修改都及时写在主存。因此对于Valatile修饰的变量的修改,
所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的
public volatile int a; 
需要满足
1)对变量的写操作不依赖于当前值。
2)该变量没有包含在具有其他变量的不变式中
参考:
http://www.2cto.com/kf/201202/118486.html
分享到:
评论

相关推荐

    java线程安全总结.doc

    java线程安全总结.doc。。。。。。。。

    java线程安全总结

    java线程安全总结 帮助你们更好的理解什么是线程 什么是网络安全

    java线程安全总结.doc下载

    java线程安全总结,是经过多人的经验总结出来的

    java线程安全总结.pdf

    java线程安全总结.pdf

    java线程安全总结[汇编].pdf

    java线程安全总结[汇编].pdf

    java线程安全性总结

    用思维导图将Java线程安全性相关基本概念联系起来

    Java线程安全问题_动力节点Java学院整理

    其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存...

    java 多线程设计模式 进程详解

    非线程安全的类 总结 第九章 多处理器机器上的并行化 单线程程序并行化 内层循环线程化 循环输出 多处理器扩展 总结 第十章 线程组 线程组概念 创建线程组 线程组方法 操作线程组 线程组、线程和安全 总结

    深入java虚拟机

    2.1 java线程安全总结 3. JVM实战 3.1 通过Java/JMX得到full GC次数? 3.2 如何更快的启动eclipse 4. JVM基础 4.1 JVM内存管理:深入Java内存区域与OOM 4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入...

    JAVA线程安全及性能的优化

    其实JAVA的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存...

    java线程详解

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 Java线程:线程的同步与锁 一、同步问题提出 二、同步和锁定 三、静态方法同步 四、如果线程不能不能获得锁会怎么样 ...Java线程:大总结

    线程安全总结.doc

    线程安全总结

    Java多线程问题总结.doc

    Java多线程问题总结.doc

    java多线程设计模式详解(PDF及源码)

    书中包含Java线程的介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第一章相关线程设计模式的介绍,都举一反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的...

    java线程总结

    java中的线程安全,是java中的一个重要知识点,同时也是面试中经常问道的问题

    java线程基础总结笔记

    1.线程安全 1.1什么是线程安全? 就是当多个线程访问某一个类(对象或方法)时,这个类(对象或方法)始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 1.2 synchronized关键字 可以在任意对象及...

    java面试问题总结

     StringBuffer : 线程安全的 当我们的字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer的正确操作。当然大多数情况下是我们是在单线程下...

Global site tag (gtag.js) - Google Analytics