黑马程序员技术交流社区

标题: 关于AtomicInteger类的用法问题 [打印本页]

作者: 冯旭君    时间: 2012-3-9 10:22
标题: 关于AtomicInteger类的用法问题
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));

        }

}


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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2