Java原子性线程

Java原子性线程

顾名思义,作为原子是微观学的不受外界影响,指在一个操作是不可中断的,一旦操作开始,就不会受到其它线程干扰。

举个例子:

比如,对于一个全局变量,String s ; 两个线程同时对它赋值,线程A给他赋值 You love me ,而B线程给它赋值 I love you。那不管这两个线程以何种方式调动工作,s 的值要么是 “I love you"要么就是"You love me”。线程A和B之间是没有干扰的。程序一旦执行就不可以中断。

注意:对于32位系统来说,long 型的数据的读写不是原子性的,因为long有64位,也就是在32位系统下如果有两个线程同时对long型数据进行该写,是受到干扰的。

public class MultiThreadLong {
    public static long t =0;
    public static class ChangeT implements Runnable {
        private long to;
        public ChangeT(long to){
            this.to = to;
        }
        public void run(){
            while(true){
                MultiThreadLong.t = to;
                Thread.yield(); // 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。
            }
        }
    }
    public static class ReadT implements Runnable {
        public void run(){
            int i =0;
            boolean f = true;
            while(f){
                long tmp = MultiThreadLong.t;
                if(tmp != 111L&&tmp!=222L&& tmp!=333L&&tmp!=444L) {
                    System.out.println(tmp);
                    i++;
                }
                Thread.yield();
                if(i>100)
                    f = false;
            }
        }
    }
    public static void main(String [] args){
        new Thread(new ChangeT(111L)).start();
        new Thread(new ChangeT(222L)).start();
        new Thread(new ChangeT(333L)).start();
        new Thread(new ChangeT(444L)).start();
        new Thread(new ReadT()).start();
    }
}
/*
代码分析:上序有四条线程Long线程,分别传入long型数据进行改写,
用 if 语句做判断进行原子判断输出。
在64 java虚拟机机条件运行是没有输出的。
但是在32位条件下,是有乱码整型数据输出的。
切记要在32位Java机虚拟机条件下运行
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

“逢雨”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值