本文对多线程的线程安全做一个简单介绍和探讨。
在特定场景下,多线程是一把利刃,可以帮助我们提升业务处理的性能,充分利用服务器的性能,甚至在某些情况下会让编程从逻辑上更简单清晰。
但是他同时是一把双刃剑,我们早就习惯了艳丽的玫瑰总是带刺的。很多时候他是复杂的,存在安全风险的。
本文将简单谈谈线程安全,也就是多线程下,程序运行正确,运行的和我们的预期是保持一致的。
原子性
我们在多线程中常常涉及到这个概念。如果我们的操作不是原子操作,那么在多线程下执行,很容易产生预期之外的结果。如* ++count* 类似这样的操作他就不是一个原子操作,包含了"读 改 写"的操作。
竞争条件
我们在程序中常常存在竞争条件,如:
- 检查再运行: 我们在检查条件后,执行操作的时候,很可能另外的进场已经修改了此前的条件;如代码中常见的惰性初始化;
锁
当我们遇到非原子操作,在多线程下可能会遇到问题。此时我们该怎么做呢?我们考虑使用锁。如java中提供的内置锁机制: synchronized块。
- 简单说明下他的运作机制,当某个线程进入此代码块,他将获得锁,此时其他进场将无法获得锁,也就无法执行这段代码块,那么这块可以看做我们上面看到的原子操作,线程们串行地执行这个代码块;
- 通过上面的解释你也会意识到,