关于并发,有一个词一定不陌生。那就是线程安全。
何为线程安全,搜索一下,可能给出的定义有很多种。
我就说说自己理解的吧,线程安全,即在多线程访问的环境中永远能保持预期的效果。(注意是没有任何例外)
有另外两句话也特别重要。
无状态对象一定是最安全的。
线程共享是基于对象的。
然后我们再来了解一下一些相关的概念: 原子性,竞态条件,内置锁,重入,可见性。
原子性:就是字面的意思。只有原子性的操作在多线程的环境下才不会出现异常的结果。synchronized 可以保证操作的原子性。
竞态条件:从多进程间通信的角度来讲,是指两个或多个进程对共享的数据进行读或写的操作时,最终的结果取决于这些进程的执行顺序。
内置锁:每个对象有一个隐性的内置锁。用于给锁住的代码块征用。
重入:对持有某对象的锁的线程来说,他可以重复进入该对象的锁住的代码块。
可见性:当前线程的修改,对于其他线程的可见性
在并发程序中使用和共享对象时,可以使用一些使用的策略,包括:
线程封闭。线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。(Ad-hoc线程封闭,栈封闭,ThreadLocal类)
只读共享。在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括不可变对象和事实不可变对象。
线程安全共享。线程安全的对象在其内部实现同步,因此多个线程可以通过独享的公有借口来进行访问而不需要进行进一步的同步。
保护对象。被保护的对象只能通过持有特定的锁来访问。保护对象包括封装在其他线程中对象的对象,以及已发布的并且由某个特定锁保护的对象。
理论摘抄至《java并发编程实战》。由于暂未并发实战,理解甚少,权当看书笔记。
原文:http://www.cnblogs.com/w2154/p/4893050.html