多线程之原子类

多线程之原子类

Java多线程编程中,我们会经常遇到各种因为数据共享带来的线程安全问题,为了解决这个问题,我们经常需要给方法或者部分代码加锁,但是如果直接通过synchronized这样的关键字加锁的话,性能不够友好,虽然Lock也可以解决这个问题,但是相比于无锁编程,性能也是不够友好,为了更好地解决这个问题,从jdk1.5开始,官方为我们提供了一系列原子类,所以今天我们就来看下如何通过原子类来保证线程安全。

我们先看这样一段代码:

public class Example extends Thread{
    private int count = 0;

    public Example(String name) {
        super();
        this.setName(name);
    }

    @Override
    public void run() {
        super.run();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("name: " + this.getName() + ", count: " + count++);
    }

    public static void main(String[] args) {
        Example a = new Example("A");
        for (int i = 0; i < 50; i++) {
            new Thread(a, "t" + i).start();
        }
    }
}

这是一段典型的java多线程共享变量的应用,如果运行上面的代码,多次运行很容易出现下面这种情况:

多线程之原子类

这种情况就是我们常说的线程安全问题,在实际应用中最常出现在我们业务代码生成序号的时候,为了解决这个问题,我们可以引入原子类,把代码中做如下调整即可:

public class Example extends Thread{
    private final AtomicInteger count = new AtomicInteger(0);

    public Example(String name) {
        super();
        this.setName(name);
    }

    @Override
    public void run() {
        super.run();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("name: " + this.getName() + ", count: " + count.getAndAdd(1));
    }

    public static void main(String[] args) {
        Example a = new Example("A");
        for (int i = 0; i < 50; i++) {
            new Thread(a, "t" + i).start();
        }
    }
}

修改之后运行你会发现,不论你运行多少次,都不会出现数据重复的问题(线程安全),这种方式的好处是,既不影响原有代码的性能,又确保了线程安全:

多线程之原子类

除了AtomicInteger,还有AtomicBooleanAtomicIntegerArrayAtomicLongAtomicLongArray,对于引用类型,我们可以用AtomicReference,用法上都差不多。

前段时间,我们的线上系统就因为多线程使用i++导致线上数据表中的序号为空,最终的解决方法就是用AtomicInteger替换了Integer,如果后面各位小伙伴在实际开发过程中遇到类似的情况,可以考虑用原子类替换原有对象试下,说不定就解了你的燃眉之急。好了,今天的内容就到这里吧!

– END –


原文始发于微信公众号(云中志):多线程之原子类

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128867.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!