“线程安全”以上或以外

守給你的承諾、 提交于 2019-12-04 18:32:53

线程安全到底是什么意思?

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

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

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

因此线程安全是一个相对于线程的概念,而不是安全的概念。它是一种相对安全,不是绝对安全。

比如,不管你怎么做同步,锁,到最后的数据安全仍然决定于最终的处理环境。

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

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

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

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

是吧!

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!