“线程安全”以上或之外 - 没有止境的道路

线程安全究竟是什么意思? 安全

如今的线程安全,流行的说法应该指的是保证类在多线程环境下的语义保持性。即:即便在多线程环境下,类的原始语义仍然获得保留。即,类不会在多线程环境下表现出跟单线程环境下同样的结果。 多线程

其实就是丢掉线程,类必须是安全的。类必须维持它的语义。为了达到这个语义,在多线程状况下须要做一些特殊处理,可是这种处理,能作的也仅仅如此:即保证类操做的语义。 线程

所以,线程安全不是指你这么处理了,而后对象就安全了。不是这样的。是指相对于线程,它安全了。或者说,多线程自己并不足以扰乱它的步伐,或者它在多线程环境下仍然表现良好(表现出正确的语义提供能力)。 对象

所以线程安全是一个相对于线程的概念,而不是安全的概念。它是一种相对安全,不是绝对安全。 内存

好比,无论你怎么作同步,锁,到最后的数据安全仍然决定于最终的处理环境。 同步

假设有十个调用层次,AND你在最终的层次也就是最顶层做了同步。但除非你的代码不向外发布,不然仍是没有办法保证数据的安全。由于你不能保证你的调用者的行为。你的调用者,他可能这么干,作一下操做A,歇一下,而后作一下操做B,而后C,,依此类推。反正这样的调用不会在瞬间完成,因此你仍是没有办法保证同步。 线程安全

换句话说,同步就是个无止境的事情。线程安全解决不了它。即便你的类都只有一个操做,也仍是解决不了这个问题。只要还存在组合状态或者说操做,数据安全的问题就不可能获得解决。这个一方面是顺序式结构自己的问题,另外一方面则是一个同步问题。 数据

有时候,换句话说,甚至你没有线程,也即只有一个线程,仍然不能保证外部有几个线程。你的调用者有几个线程。好比你就一个线程,UI线程,可是有多个用户。这几个用户,他们自己就是“线程”。无论JAVA内部的数据同步机制如何,人脑可不是JAVA能处理的东西是吧。 共享内存

再换句话说:即便线程“安全”了又如何是吧。安全的范围仍然只在“线程”。也就是说,线程被保证了拿到正确的数据,可是WHAT ABOUT OTHER PLAYERS, RIGHT?好比,人?好比客户机,好比别的什么不在本地共享内存块中的东西。

是吧!

相关文章
相关标签/搜索