1. 1 不可撤销
  2. 2 小年兽 程嘉敏
  3. 3 手放开 李圣杰
  4. 4 迷人的危险3(翻自 dance flow) FAFA
  5. 5 山楂树之恋 程佳佳
  6. 6 summertime cinnamons / evening cinema
  7. 7 不谓侠(Cover 萧忆情Alex) CRITTY
  8. 8 神武醉相思(翻自 优我女团) 双笙
  9. 9 空山新雨后 音阙诗听 / 锦零
  10. 10 Wonderful U (Demo Version) AGA
  11. 11 广寒宫 丸子呦
  12. 12 陪我看日出 回音哥
  13. 13 春夏秋冬的你 王宇良
  14. 14 世界が终わるまでは… WANDS
  15. 15 多想在平庸的生活拥抱你 隔壁老樊
  16. 16 千禧 徐秉龙
  17. 17 我的一个道姑朋友 双笙
  18. 18 大鱼  (Cover 周深) 双笙
  19. 19 霜雪千年(Cover 洛天依 / 乐正绫) 双笙 / 封茗囧菌
  20. 20 云烟成雨(翻自 房东的猫) 周玥
  21. 21 情深深雨濛濛 杨胖雨
  22. 22 Five Hundred Miles Justin Timberlake / Carey Mulligan / Stark Sands
  23. 23 斑马斑马 房东的猫
  24. 24 See You Again Wiz Khalifa / Charlie Puth
  25. 25 Faded Alan Walker / Iselin Solheim
  26. 26 Natural J.Fla
  27. 27 New Soul Vox Angeli
  28. 28 ハレハレヤ(朗朗晴天)(翻自 v flower) 猫瑾
  29. 29 像鱼 王贰浪
  30. 30 Bye Bye Bye Lovestoned
  31. 31 Blame You 眠 / Lopu$
  32. 32 Believer J.Fla
  33. 33 书信 戴羽彤
  34. 34 柴 鱼 の c a l l i n g【已售】 幸子小姐拜托了
  35. 35 夜空中最亮的星(翻自 逃跑计划) 戴羽彤
  36. 36 慢慢喜欢你 LIve版(翻自 莫文蔚) 戴羽彤
  37. 37 病变(翻自 cubi) 戴羽彤
  38. 38 那女孩对我说 (完整版) Uu
  39. 39 绿色 陈雪凝
  40. 40 月牙湾 LIve版(翻自 F.I.R.) 戴羽彤
夜空中最亮的星(翻自 逃跑计划) - 戴羽彤
00:00 / 04:10

夜空中最亮的星 能否听清

那仰望的人 心底的孤独和叹息

夜空中最亮的星 能否记起

那曾与我同行 消失在风里的身影

我祈祷拥有一颗透明的心灵

和会流泪的眼睛

给我再去相信的勇气

越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请指引我靠近你

夜空中最亮的星 是否知道

那曾与我同行的身影 如今在哪里

夜空中最亮的星 是否在意

是等太阳先升起 还是意外先来临

我宁愿所有痛苦都留在心底

也不愿忘记你的眼睛

哦 给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行 哒~

我祈祷拥有一颗透明的心灵

和会流泪的眼睛 哦

给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行

多线程之原子类

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,如果后面各位小伙伴在实际开发过程中遇到类似的情况,可以考虑用原子类替换原有对象试下,说不定就解了你的燃眉之急。好了,今天的内容就到这里吧!

posted @ 2021-07-15 13:38  云中志  阅读(46)  评论(0编辑  收藏  举报