java atom,java atomic实现原理

  java atom,java atomic实现原理

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

  

  在Java。util。当前。原子的包下,有AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference等类,它们的基本特性就是在多线程环境下,执行这些类实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由虚拟机(Java虚拟机的缩写)从等待队列中选择一个另一个线程进入。

  举例说明

  以原子球为例,单线程执行普通的方法(如下),不会出现线程问题:

  包com。二哥。测试。原子的;

  /**

  * @作者朱智生

  * @描述

  * @日期2016/5/26。

  */

  公共类正常布尔型实现可运行{

  公共静态布尔出口=假

  私有字符串名称;

  公共正常布尔(字符串名){

  this.name=name

  }

  @覆盖

  公共无效运行(){

  如果(!出口){

  出口=真

  System.out.println(名称,步骤1 );

  System.out.println(名称,步骤2 );

  System.out.println(名称,步骤3 );

  出口=假

  }否则{

  System.out.println(name ,step else );

  }

  }

  公共静态void main(String[] args) {

  new NormalBoolean(张三).run();

  }

  }然而,当多线程执行时,就会出现在执行判断之后的命令时,会有其他线程插入,变更出口的值。如下段代码:

  包com。二哥。测试。原子的;

  /**

  * @作者朱智生

  * @描述

  * @日期2016/5/26。

  */

  公共类正常布尔值2实现可运行{

  公共静态布尔出口=假

  私有字符串名称;

  公共正常布尔2(字符串名称){

  this.name=name

  }

  @覆盖

  公共无效运行(){

  如果(!出口){

  尝试{

  线程。睡眠(1000);

  } catch (InterruptedException e) {

  e。printstacktrace();

  }

  出口=真

  System.out.println(名称,步骤1 );

  System.out.println(名称,步骤2 );

  尝试{

  线程。睡眠(1000);

  } catch (InterruptedException e) {

  e。printstacktrace();

  }

  System.out.println(名称,步骤3 );

  出口=假

  }否则{

  System.out.println(name ,step else );

  }

  }

  }同时执行两线程,打印结果为:

  张三,步骤一

  李四,步骤一

  张三,步骤2

  李四,步骤2

  张三,步骤3

  李四,步骤3现在,使用原子球就可以确保多线程的情况下安全的运行,只有一个线程进行业务处理。

  包com。二哥。测试。原子的;

  导入Java。util。并发。原子的。原子布尔;

  /**

  * @作者朱智生

  * @描述

  * @日期2016/5/26。

  */

  公共类TestAtomicBoolean实现可运行{

  公共静态原子布尔exits=新原子布尔(false);

  私有字符串名称;

  public TestAtomicBoolean(字符串名称){

  this.name=name

  }

  @覆盖

  公共无效运行(){

  if(exits.compareAndSet(false,true)){

  尝试{

  线程。睡眠(1000);

  } catch (InterruptedException e) {

  e。printstacktrace();

  }

  System.out.println(名称,步骤1 );

  System.out.println(名称,步骤2 );

  尝试{

  线程。睡眠(1000);

  } catch (InterruptedException e) {

  e。printstacktrace();

  }

  System.out.println(名称,步骤3 );

  出口。set(假);

  }否则{

  System.out.println(name ,step else );

  }

  }

  }当两个线程执行此类时,打印结果如下:

  张三,步骤其他

  李四,步骤一

  李四,步骤2

  李四,步骤3测试类:

  包com。二哥。测试。原子的;

  /**

  * @作者朱智生

  * @描述

  * @日期2016/5/26。

  */

  公共类TestBoolean {

  公共静态void main(String[] args) {

  Thread Thread 1=新线程(新正常布尔2(’李四));

  Thread Thread 2=新线程(新正常布尔2(’张三));

  线程1。start();

  线程2。start();

  //-

  Thread Thread 3=new Thread(new TestAtomicBoolean(’李四));

  Thread Thread 4=new Thread(new TestAtomicBoolean(张三));

  线程3。start();

  线程4。start();

  }

  }以上就是爪哇岛中原子的类之原子球的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: