servlet线程安全

什么是线程安全?

冷暖自知 提交于 2019-12-04 18:33:05
给“线程安全”下定义是件非常棘手的事儿。随便Google一下,就能得到成千上万像这样的定义: 1.“线程安全”的代码是指在多线程同时执行的情况下,依然能正常工作的代码。 2.一段代码,如果在多线程同时执行的情况下,能以一种安全的方式操作共享数据结构,它就是线程安全的。 还有很多类似的定义。 你不觉着类似上面这种定义非但没有传达出有用的信息,甚至让自己更加迷惑吗?尽管这样,这些定义还是被大家无奈的接受了,因为它并没有错。只是,他们没能提供任务实质性的帮助或见解。 我们怎么区别“线程安全”的类和不安全的类?甚至说“安全”到底什么意思? 在线程安全中,什么是“正确性”? 任何对“线程安全”的合理定义,其核心都是在说“正确性”的概念。所以在理解线程安全之前,我们先来搞懂什么是“正确性”。 正确性意味着一个类要符合它的规范 一个好的类规范会明确规定出类在某个时刻的状态,以及对它进行一些操作后的后置条件(postcondition)。但是,通常我们并不能为我们的类提供充分的规范说明,那我们怎么知道他们是否正确执行了?我们并不能知道,但是这并不能阻止我们去使用它,一旦我们说服了自己“这些代码能正确工作”。这种“代码信任”就非常接近我们要说的“正确性”。 现在我们可以给“线程安全”下一个不那么绕的定义: 一个类在多线程并发访问时仍能保证行为的正确性,那么它就是线程安全的类。