旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

java什么是线程平安【JAVA教程】,java

作者:搜教程发布时间:2019-11-27分类:JAVA教程浏览:73评论:0


导读:要编写线程平安的代码,其中心在于要对状况接见操纵举行治理,特别是对同享的和可变的状况的接见。当多个线程接见某个状况变量,而且其中有一个线程实行写入操纵时,必需采纳同步机制来谐和这些...
要编写线程平安的代码,其中心在于要对状况接见操纵举行治理,特别是对同享的和可变的状况的接见。当多个线程接见某个状况变量,而且其中有一个线程实行写入操纵时,必需采纳同步机制来谐和这些线程对变量的接见。无状况对象一定是线程平安的。

假如我们在无状况的对象中增添一个状况时,会涌现什么状况呢?

假定我们根据以下体式格局在servlet中增添一个"掷中计数器"来治理要求数目:在servlet中增添一个long范例的域,每处置惩罚一个要求就在这个值上加1。

public class UnsafeCountingFactorizer implements Servlet {
     private long count = 0;
 
     public long getCount() {
            return count ;
     }
 
     @Override
     public void service(ServletRequest arg0, ServletResponse arg1)
                 throws ServletException, IOException {
            // do something
           count++;
     }
}

不幸的是,以上代码不是线程平安的,因为count++并不是是原子操纵,实际上,它包括了三个自力的操纵:读取count的值,将值加1,然后将计算效果写入count。假如线程A读到count为10,立时线程B读到count也为10,线程A加1写入后为11,线程B因为已读过count值为10,实行加1写入后依旧为11,如许就丧失了一次计数。

在并发编程中,这类因为不适当的实行时序而涌现不正确的效果是一种非常重要的状况,它有一个正式的名字:竞态前提。最罕见的竞态前提范例就是“先搜检后实行”操纵,即经由过程一个可以失效的观察效果来决议下一步操纵,

耽误初始化是竞态前提的罕见情况:

public class LazyInitRace {
     private SomeObject instance = null;
     public SomeObject getInstance() {
            if(instance == null)
                 instance = new SomeObject();
            return instance ;
     }
}

在LazyInitRace中包括竞态前提:起首线程A推断instance为null,然后线程B推断instance也为null,以后线程A和线程B离别建立对象,如许对象就举行了两次初始化,发作毛病。

要防备静态前提,就必需在某个线程修正变量时,经由过程某种体式格局防备其他线程运用这个变量,从而确保其他线程只能在修正操纵完成之前或以后读取和修正状况,而不是在修正状况的过程当中。
在UnsafeCountingFactorizer 例子中,线程不平安的原因是count ++并不是原子操纵,我们可以运用原子类,确保加操纵是原子的,

如许类就是线程平安的了:

 public class CountingFactorizer implements Servlet {
     private final AtomicLong count = new AtomicLong(0);
 
    public long getCount() {
          return count .get() ;
   }
 
    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
               throws ServletException, IOException {
          // do something
          count.incrementAndGet();
   }
}

AtomicLong是java.util.concurrent.atomic包中的原子变量类,它可以完成原子的自增操纵,如许就是线程平安的了。

以上就是java什么是线程平安的细致内容,更多请关注ki4网别的相干文章!

标签:java


欢迎 发表评论: