从使用synchronized同步锁到AtomicInteger原子操作

简介: 从使用synchronized同步锁到AtomicInteger原子操作

有一个场景需要实现多线程处理任务完毕后,再串行处理后面的流程。


下面首先介绍的方式,是通过synchronized同步锁来实现,这是一种最基础的方式,后面的文章,我整理其他其他更丰富的方法。


通过synchronized同步锁来实现:


就是放置一个公用的static变量,假如有10个线程,每个线程处理完上去累加下结果,然后后面用一个死循环(或类似线程阻塞的方法),去数这个结果,达到10个,说明大家都执行完了,就可以执行后续的事情了,这个想法虽然土鳖,但是基本上跟语言无关,几乎所有主流编程语言都支持。


下面直接上代码:

public class ThreadLockTest {
    public static Integer flag = 0;//公用变量
    public static void main(String[] args) throws Exception {
        ThreadLockTest testObj = new ThreadLockTest();
        final int threadNum = 10;
        for (int i = 0; i < threadNum; i++) {
            new Thread(new MyRunable(i, testObj)).start();
        }
        while (true) {
            if (testObj.flag >= threadNum) {
                System.out.println("-----------\n所有thread执行完成!");
                break;
            }
            Thread.sleep(10);
        }
    }
    static class MyRunable implements Runnable {
        int _i = 0;
        ThreadLockTest _test;
        public MyRunable(int i, ThreadLockTest test) {
            this._i = i;
            this._test = test;
        }
        @Override
        public void run() {
            try {
                Thread.sleep((long) (Math.random() * 10));
                System.out.println("thread " + _i + " done");
                //利用synchronized获得同步锁
                synchronized (_test) {
                    _test.flag += 1;
                }
                System.out.println("thread " + _i + " => " + _test.flag);//测试用
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


可以看到上面使用synchronized获得同步锁的处理类似下面的代码,其中必须加上synchronized是为了证不会出现并发线程同时访问的情况。

public class Sample1 {
    private static Integer count = 0;
    synchronized public static void increment() {
        count++;
    }
}


升级开始,下面再来看一段代码:

public class Sample2 {
    private static AtomicInteger count = new AtomicInteger(0);
    public static void increment() {
        count.getAndIncrement();
    }
}


上面使用AtomicInteger中却不用加上synchronized,因为AtomicInteger是一个提供原子操作的Integer类,它是通过线程安全的方式操作加减,因此十分适合高并发情况下的使用。


两相对比下来,是不是使用AtomicInteger更简单呢。下面咱就对最上面的代码,使用AtomicInteger优化调整一下,于是就有了下面的代码:

import java.util.concurrent.atomic.AtomicInteger;
public class ThreadAtomTest {
    public static AtomicInteger atomicInteger = new AtomicInteger(0);
    public static void main(String[] args) throws Exception {
        final int threadNum = 10;
        for (int i = 0; i < threadNum; i++) {
            new Thread(new ThreadAtomTest.MyRunable(i)).start();
        }
        while (true) {
            if (ThreadAtomTest.atomicInteger.intValue() >= threadNum) {
                System.out.println("-----------\n所有thread执行完成!");
                break;
            }
            Thread.sleep(10);
        }
    }
    static class MyRunable implements Runnable {
        int _i = 0;
        public MyRunable(int i) {
            this._i = i;
        }
        @Override
        public void run() {
            try {
                Thread.sleep((long) (Math.random() * 10));
                System.out.println("thread " + _i + " done");
                int andIncrement = ThreadAtomTest.atomicInteger.incrementAndGet();
                System.out.println("thread " + _i + " => " + andIncrement);//测试用
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


相关文章
|
3月前
|
Java
synchronized
synchronized
15 2
|
12月前
总结 synchronized
总结 synchronized
45 0
|
3月前
|
存储 安全 Java
|
10月前
|
安全 算法 Java
synchronized 同步锁
Java中的synchronized关键字用于实现线程同步,可以修饰方法或代码块。 1. 修饰方法:当一个方法被synchronized修饰时,只有获得该方法的锁的线程才能执行该方法。其他线程需要等待锁的释放才能执行该方法。 2. 修饰代码块:当某个对象被synchronized修饰时,任何线程在执行该对象中被synchronized修饰的代码块时,必须先获得该对象的锁。其他线程需要等待锁的释放才能执行同步代码块。Java中的每个对象都有一个内置锁,当一个对象被synchronized修饰时,它的内置锁就起作用了。只有获得该锁的线程才能访问被synchronized修饰的代码段。使用synch
51 0
|
11月前
Synchronized
作用:能够保证在同一时刻最多有一个线程执行该段代码,以保证并发的安全性。(当第一个线程去执行该段代码的时候就拿到锁,并独占这把锁,当方法执行结束或者一定条件后它才释放这把锁,在没释放锁之前,所有的线程处于等待状态)
45 0
|
Java
07.synchronized都问啥?
大家好,我是王有志。经过JMM和锁的铺垫,今天我们正式进入synchronized的内容,来看看关于synchronized面试中都会问啥?
41 1
07.synchronized都问啥?
synchronized的总结
synchronized的总结
synchronized的总结
|
存储 缓存 安全
synchronized的简单理解
synchronized的简单理解
80 0
|
Java 编译器
10.关于synchronized的一切,我都写在这里了
大家好,我是王有志。我们已经完成了synchronized的学习,今天我们利用学习到的知识去回答一些关热点问题。
72 0
|
存储 缓存 安全
【Synchronized】
【Synchronized】
120 0
【Synchronized】