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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。