面包屑之java并发

关于并发,有一个词一定不陌生。那就是线程安全

何为线程安全,搜索一下,可能给出的定义有很多种。

我就说说自己理解的吧,线程安全,即在多线程访问的环境中永远能保持预期的效果。(注意是没有任何例外)

有另外几句话也特别重要。

无状态对象一定是最安全的。

线程共享是基于对象的。

存在共享可变对象才会存在线程安全问题。(找出共享对象,假想多线程访问...)

然后我们再来了解一下一些相关的概念: 原子性,竞态条件,内置锁,重入,可见性。

原子性:就是字面的意思。只有原子性的操作在多线程的环境下才不会出现异常的结果。synchronized 可以保证操作的原子性。

竞态条件:从多进程间通信的角度来讲,是指两个或多个进程对共享的数据进行读或写的操作时,最终的结果取决于这些进程的执行顺序。

内置锁:每个对象有一个隐性的内置锁。用于给锁住的代码块征用。

重入:对持有某对象的锁的线程来说,他可以重复进入该对象的锁住的代码块。

可见性:当前线程的修改,对于其他线程的可见性

锁是基于对象的,在java中万物皆对象,类也是对象,绑定在类上的锁和它实例对象的锁完全是两码事。从java内存区来说,类信息是放在方法区,对象是放在堆上,也不可能有一把锁可以同时锁住两个不同的位置。 另补充一点,sleep不会释放锁,wait会释放锁。

在并发程序中使用和共享对象时,可以使用一些不错的策略,包括:

  线程封闭。线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。(Ad-hoc线程封闭,栈封闭,ThreadLocal类)

  只读共享。在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括不可变对象和事实不可变对象。

  线程安全共享。线程安全的对象在其内部实现同步,因此多个线程可以通过独享的公有借口来进行访问而不需要进行进一步的同步。

  保护对象。被保护的对象只能通过持有特定的锁来访问。保护对象包括封装在其他线程中对象的对象,以及已发布的并且由某个特定锁保护的对象。

理论摘抄至《java并发编程实战》。由于暂未并发实战,理解甚少,权当看书笔记。

  

原文地址:https://www.cnblogs.com/w2154/p/4893050.html