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

java并发你也许不知道的(读Java Concurrency in Practice)

    博客分类:
  • java
阅读更多
1.线程安全
a.无状态的类是线程安全的
b.所有状态都具有原子性的类是线程安全的
原子性:即对该类的操作是不被打断的,即使在多线程的环境下
如果一个类只有单个状态,推荐使用jdk中的java.util.concurrent.atomic包AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicIntegerFieldUpdater
AtomicLong
AtomicLongArray
AtomicLongFieldUpdater
AtomicMarkableReference
AtomicReference
AtomicReferenceArray
AtomicReferenceFieldUpdater
AtomicStampedReference
这些类作为状态都具有原子性
2.Synchronized
a.如果一个方法用Synchronized关键字修饰,则调用该方法所用的锁,为调用方法的对象的固有锁(如反射),如果同时带有Static关键字修饰,则使用的锁为该方法所在的class对象的固有锁。
固有锁:每个对象都隐性地带有一个锁,该锁为重入锁(重入锁将在后文介绍),用于synchronized关键字
像Vector,HashTable这样的类,其实就是用了类的固有锁,这该锁限制每个该类的方法都必须先获得该锁,才能继续执行

3.重入锁
关于重入锁的解释用书中英文的解释会更准确:But because intrinsic locks are reentrant, if a thread tries to acquire a lock that it already holds, the request succeeds.

可能看完上面的还是有点难理解
举一个书中的例子:
看以下代码

假设不是可重入锁,那会出现一个什么现象?
调用super.doSomething()时发现该方法被锁住了,然后等待,但等待的锁自己正持有着,也就变成了死锁

重入锁的实现:
重入锁是通过一个count和记录owner--一个持有该锁的Thread来实现的。当count值为0,认为这个锁当前没被任何线程持有。当一个线程持有了该锁了,jvm就会把owner置为该线程,并把count置为1,如果同样锁线程再次请求该锁,那jvm就会把count+1,如果线程退出同步块,则count-1,当count为0时,锁就释放了。

4.线程状态的锁操作
对于每一个涉及到多个变量的不变量,所有涉及到的变量都应该用同一个锁来进行同步
怎么理解呢?
看例子:

在vector中,每个方法都是用synchronized修饰的,但在上面的使用中--如果两个线程先后进入该语句块,再轮流执行vector.contain(element),显然还是会添加两次同样的element到vector中,所以还是不能保证vector的原子性

5.程序中的代码是可能被打乱的
如果没有进行同步,编译器,进程,和运行环境将有可能会打乱运行的顺序。
如文中所举例子:

将有可能出现这样的状况:输出结果为0.
这是因为执行的顺序被打乱了

6.64位数据的读或写是非原子性的
一般的数据类型,如int,执行
int a = 1;
int b = a;
这些操作都是原子操作,但是像long,double就不是了
jvm是允许把64位数据的读和写分开两次操作的,每次操作32位。
因此,有些项目,我们对某些数据的实时性不会太在意,就不会定义该变量为原子变量,但如果是long或者double类型,就要小心了。很有可能某用户在读取的时候读到的是前一个数据的前32位,和后一个数据的后32位

7.volatile关键字
当一个变量用volatile声明了,编译器会放一个notice到该变量的共享区,然后当执行的时候,就不会对这个变量在程序中的执行顺序进行修改。并且volatile不会缓存在寄存器中,也不会缓存在别的进程中,因此,读volatile修饰的变量时总能返回一个最新更新的值。

使用锁能同时保证变量的可见性和原子性,但volatile只能保证其可见性。

什么时候不适合使用volatile?
举一个经典的例子:i++操作,在并发环境下volatile是不能保证其正确性的

什么时候可以用volatile?
* 该变量的值不依赖该变量当前的值,像i++,或者你能保证该变量的更新只在单线程的环境下出现
* 该变量不和其他的变量一起包含在一个不变量中,如上文的vector
* 由于其他的原因,该变量不需要使用锁
  • 大小: 12.1 KB
  • 大小: 3.8 KB
  • 大小: 19.2 KB
1
0
分享到:
评论
2 楼 snake1987 2011-03-29  
NanguoCoffee 写道
用4来检验1.b,就发现1.b是不对的。


像Vecotr那样的,其实是线程安全的,因为按照他的定义,他的每个方法都是线程安全的,关键是你用了两个方法来执行一个原子性操作,这是别人方法定义中没有注明的
这与线程安全的概念是不违背的
1 楼 NanguoCoffee 2010-09-06  
用4来检验1.b,就发现1.b是不对的。

相关推荐

    Java Concurrency in Practice JAVA并发编程实践(中英文版)

    Using the concurrency building blocks in java.util.concurrent Performance optimization dos and don'ts Testing concurrent programs Advanced topics such as atomic variables, nonblocking algorithms, ...

    Java并发实践英文版(Java Concurrency in Practice)

    - **书名**:《Java并发实践》(Java Concurrency in Practice) - **作者**:Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea - **出版社**:Addison Wesley Professional - **...

    Java并发编程实践(java concurrency in practice)pdf (java多线程总结.ppt)

    《Java并发编程实践》是Java开发者必读的经典之作,由Brian Goetz等多位专家共同撰写。这本书深入浅出地探讨了Java平台上的并发问题,帮助读者理解和掌握如何编写高效、可靠且可维护的多线程应用程序。以下是该书...

    Java Concurrency in Practice JAVA并发编程实践中文版(全)

    Java Concurrency in Practice JAVA并发编程实践中文版(全)第二部分

    Java并发编程实践 java concurrency in practice

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...

    Java并发编程实践(Java Concurrency in Practice) (中英版)

    《Java并发编程实践》是Java开发者深入理解和应用并发编程的权威指南,这本书全面覆盖了Java并发编程的各种核心概念和技术,旨在帮助程序员编写出高效、安全的并发代码。书中的内容既包括理论知识,也包含丰富的实战...

    Java Concurrency in Practice.zip

    《Java Concurrency in Practice》是Java并发编程领域的一本经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和Doug Lea等专家共同编写。这本书深入探讨了Java平台上的多线程和并发编程,旨在...

    Java Concurrency in Practice Java并发编程

    《Java Concurrency in Practice》是Java并发编程领域的一本权威著作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea等多位Java并发领域的专家共同编写。这本书深入探讨了Java平台上的多线程和...

    java并发最佳书籍Java.Concurrency.in.Practice

    最近在学习java并发相关,发现这边书还挺不错的,这本书是多人合著的,作者中不乏牛人,有 Joshua Bloch ( Effective Java 作者)和 Doug Lea 等等(中文中惯用的表示牛人多的说法)。

    Java Concurrency In Practice Learning Note

    本笔记将深入探讨《Java Concurrency In Practice》这本书中的核心概念,结合Guava库的实际使用案例,帮助读者理解并掌握Java并发编程的精髓。 首先,我们来了解Java并发的基础知识。Java提供了丰富的并发工具类,...

    Concurrent_Programming+Java Concurrency in Practice+langspec

    首先,"Java Concurrency in Practice"是Java并发编程的经典之作,由Brian Goetz、Tim Peierls、Joshua Bloch、David Holmes和Doug Lea合著。这本书提供了一套实用的指导原则、设计模式和最佳实践,帮助Java开发者...

    Java Concurrency in Practice电子书PDF加源码包

    java_concurrency_in_practice.pdf jcip-examples-src.jar jcip-annotations-src.jar 英文版是高清晰的,实战和实践都是同一帮人对英文版书的翻译,网传实战的翻译质量更好,实战是2012年出版的,应该是对前一版实践...

    Java Concurrency In Practice.pdf

    《Java Concurrency In Practice》是一本关于Java并发编程的经典著作,由Brian Göetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes和Doug Lea共同编写。本书深入探讨了Java平台上的多线程编程技巧,...

    java_concurrency_in_practice_source源代码

    这里的"java_concurrency_in_practice_source"源代码正是书中实例的实现,它涵盖了Java多线程编程中的关键概念和技术。 1. **线程基础**:Java中创建线程有两种方式,一是通过`Thread`类的子类,二是实现`Runnable`...

    Java concurrency in practice

    《Java并发实践》一书由Brian Göetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes和Doug Lea共同编写,是Java并发领域的重要参考书籍。本书全面覆盖了Java并发的基础理论和实践技巧,对于希望深入...

    《Java Concurrency in Practice》(JAVA并发编程实践)电子书

    博文链接:https://projector.iteye.com/blog/209730

Global site tag (gtag.js) - Google Analytics