水平有限,谈谈自己的理解。

不说java了,说说普遍上的线程安全问题吧。多线程共享变量是很容易导致错误发生的,需要严格的控制。一般来说,简单的方法就是加锁。保证在一段时间中,只有一个线程在修改这个变量,并保持这个变量的值一段时间。这其实涉及一个概念,那就是原子操作。假如线程对变量的修改是原子性的,那么其实也没有什么线程安全的问题,最坏的情况可能就是竞争,两个线程在同一时刻都在修改这个变量,导致这个变量的值是不确定的。这样可能会对程序的逻辑造成影响。程序逻辑很怕这种不确定性。

加锁的好处就是避免竞争。同一时刻就一个线程修改变量,并保持一段时间。这样对程序逻辑是很安全的,消除了不确定性。

加锁就可能会有互锁的问题,也就是死锁。比较典型的就是五个哲学家吃面的问题。当然这属于程序设计逻辑问题,并非是锁的错。

但不管怎么说,使用共享变量这种基础线程模型,锁基本上来说是必须的。除非你的业务非常的简单。比如打一枪换一个地方,也不管结果如何。

如果你使用java开发的话,你其实很幸福,java有非常成熟的并发框架,而且从1.6好像就已经有了。强烈建议在java上玩并发的人,放弃那些元语吧,用并发框架可以做的更好,更安全,而且99%的情况都能满足。

如果你喜欢通讯模型可以考虑AKKA。它的线程模型采用的是 Erlang 的方式,就是在很多actor(角色)之间通讯,来进行同步动作的。很高级,很容易理解,也很安全。而且性能也不错。AKKA现在很成熟了,发展很多年了。

玩python的同学就放弃线程吧,可以考虑协程,比如eventlet。java上应该也有协程框架,但是我不了解,不过原理应该都是一个样。协程是没有竞争问题的,不会出现竞争共享内存的情况。

语无伦次,想到哪里写到哪里。海涵。