A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯旭君 中级黑马   /  2012-3-9 10:22  /  3609 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

AtomicInteger不是线程安全的吗  多个线程访问为什么会有问题呢  运行下看看结果



package threads;

import java.util.concurrent.atomic.AtomicInteger;

public class MultiThreadShareData3 {

        private int data = 100;

        AtomicInteger ai = new AtomicInteger(100);

        public static void main(String[] args) {

                MultiThreadShareData3 x = new MultiThreadShareData3();

                Thread1 thread1 = x.new Thread1();

                Thread2 thread2 = x.new Thread2();

                for (int i = 0; i < 2; i++) {

                        new Thread(thread1).start();
                        new Thread(thread2).start();

                }

        }

        class Thread1 implements Runnable {
                @Override
                public void run() {
                        // TODO Auto-generated method stub
                        while (true) {
                                // decrease();
                                ai.addAndGet(-1);
                                System.out.println(Thread.currentThread().getName()
                                                + "  is changing data by decrementAndGet()  "
                                                + ai.get());
                               
                               
                        }

                }
        }

        class Thread2 implements Runnable {

                @Override
                public void run() {
                        // TODO Auto-generated method stub

                        while (true) {
                                // increase();
                               
                                ai.addAndGet(1);
                                System.out.println(Thread.currentThread().getName()
                                                + "  is changing data by incrementAndGet()  "
                                                + ai.get());
                               
                               
                        }

                }
        }

        public synchronized void decrease() {

                System.out.println(Thread.currentThread().getName()
                                + "  decrease() is changing " + (--data));

        }

        public synchronized void increase() {

                System.out.println(Thread.currentThread().getName()
                                + "  increase() is changing " + (++data));

        }

}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

1 个回复

倒序浏览
AtomicInteger 原子类基本工作原理是使用了同步synchronized的方法实现了对一个linteger,对象的增、减、赋值(更新)操作. 比如对于++运算符AtomicInteger可以将它持有的integer 能够原子地递增。但是在需要访问两个或两个以上 atomic变量的程序代码(或者是对单一的atomic变量执行两个或两个以上的操作)通常都需要被synchronize以便两者的操作能够被当作是一个atomic单元。你那程序我没细看,不还是多个线程访问同一个变量的问题当然不安全。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马