告诉你多线程那些破事
|
止汽车频繁变道加塞可以采取在车道间增加『护栏』,那在程序的世界该怎么做呢? 程序世界中多线程遇到的问题归纳起来就是三类:『线程安全问题』、『活跃性问题』、『性能问题』,接下来会讲解这些问题,以及问题对应的解决手段。 线程安全问题有时候我们会发现,明明在单线程环境中正常运行的代码,在多线程环境中可能会出现意料之外的结果,其实这就是大家常说的『线程不安全』。那到底什么是线程不安全呢?往下看。 原子性 举一个银行转账的例子,比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元,两个操作都成功才意味着一次转账最终行转账这个例子有两个步骤,出现了意外后导致转账失败,说明没有原子性。 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 原子操作:即不会被线程调度机制打断的操作,没有上下文切换。 在并发编程中很多操作都不是原子操作,出个小题目:面这四个操作中有哪些是原子操作,哪些不是的?不熟悉的人可能认为这些都是原子操作,其实只有操作1是原子操作。
在单线程环境下上述四个操作都不会出现问题,但是在多线程环境下,如果不通过加锁操作,往往可能得到意料之外的值。 在Java语言中通过可以使用synchronize或者lock来保证原子性。 可见性 talk is cheap,先show一段代码:程1执行update方法将 i 赋值为100,一般情况下线程1会在自己的工作内存中完成赋值操作,却没有及时将新值刷新到主内存中。 这个时候线程2执行get方法,首先会从主内存中读取i的值,然后加载到自己的工作内存中,这个时候读取到i的值是50,再将50赋值给j,最后返回j的值就是50了。原本期望返回100,结果返回50,这就是可见性问题,线程1对变量i进行了修改,线程2没有立即看到i的新值。
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 (编辑:文章分享网_茂名站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



