线程带来的风险
- 安全性问题 ----> 安全性的含义是“永远不发生糟糕的事”
线程安全问题非常复杂,在没有充分同步的情况下,多个线程中的操作顺序是无法预测的。
如果没有同步,那么无论是编译器、硬件还是运行时,都可以随意安排操作的执行顺序和时间,例如对寄存器或者处理器中的变量进行缓存(缓存后成为当前线程的局部变量),而这些被缓存的变量对于其他线程来说是暂时(甚至永久)不可见的。
- 活跃性问题 ----> 活跃性的含义是“正确地事最终会发生”
多线程环境中活跃性问题的常见形式:死锁、活锁、饥饿 - 性能问题
性能问题与活跃性密切相关,活跃性意味着某件正确地事最终会发生,性能问题则关注让其尽快发生。性能问题包含多个方面,例如服务时间过长、响应不灵敏,吞吐率过低等。
Java中使用锁来实现同步、原子操作等功能,但锁的使用会带来性能方面的问题。当执行时间较长的计算或者可能无法快速完成的操作时(例如网络IO、控制台IO),一定不要持有锁。