首页 > 编程语言 > 详细

java并发之线程安全问题

时间:2020-09-25 19:11:42      阅读:10      评论:0      收藏:0      [点我收藏+]

标签:同步   需要   不可   重点   java   不可变对象   

并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务。
  
  而Java并发则由多线程实现的。
  
  在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中。(当然这是比较笼统的说法,线程之间是可以交互的,他们也不一定是串行。)
  
  多线程的存在就是压榨cpu,提高程序性能,还能减少一定的设计复杂度(用现实的时间思维设计程序)。
  
  多线程会引出很多难以避免的问题, 如死锁,脏数据,线程管理的额外开销,等等。更大大增加了程序设计的复杂度。
  
  死锁和脏数据就是典型的线程安全问题。
  
  简单来说,线程安全就是: 在多线程环境中,能永远保证程序的正确性。
  
  只有存在共享数据时才需要考虑线程安全问题。
  
  解决线程安全问题:
  
  如何解决的确是该流程的重点。目前分三种方式解决:
  
  第一种,修改线程模型。即不在线程之间共享该状态变量。一般这个改动比较大,需要量力而行。
  
  第二种,将对象变为不可变对象。有时候实现不了。
  
  第三种,就比较通用了,在访问状态变量时使用同步。 synchronized和Lock都可以实现同步。简单点说,就是在你修改或访问可变状态时加锁,独占对象,让其他线程进不来。
  
  这也算是一种线程隔离的办法。(这种方式也有不少缺点,比如说死锁,性能问题等等)
  
  其实有一种更好的办法,就是设计线程安全类。《代码大全》就有提过,问题解决得越早,花费的代价就越小。
  
  是的,在设计时,就考虑线程安全问题会容易的多。
  
  首先考虑该类是否会存在于多线程环境。如果不是,则不考虑线程安全。
  
  然后考虑该类是否能设计为不可变对象,或者事实不可变对象。如果是,则不考虑线程安全
  
  最后,根据流程来设计线程安全类。
  
  设计线程安全类流程:
  
  1、找出构成对象状态的所有变量。
  
  2、找出约束状态变量的不变性条件。
  
  3、建立对象状态的并发访问管理策略。

java并发之线程安全问题

标签:同步   需要   不可   重点   java   不可变对象   

原文:https://www.cnblogs.com/huimuran/p/13731403.html

(0)
(0)
   
举报
评论 一句话评论(0
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号