java voliate_Java之voliate, synchronized, AtomicInteger使用

java voliate_Java之voliate, synchronized, AtomicInteger使用1:voliate用在多线程,同步变量。线程为了提高效率,将成员变量(如A)某拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A),但是不能用其来进行多线程同步控制publicclassCounter…

大家好,又见面了,我是你们的朋友全栈君。

1: voliate

用在多线程,同步变量。 线程为了提高效率,将成员变量(如A)某拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) ,但是不能用其来进行多线程同步控制

publicclassCounter {

publicvolatilestaticintcount =0;

publicstaticvoidinc() {

//这里延迟5毫秒,使得结果明显

try{

Thread.sleep(5);

} catch(InterruptedException e) {

}

//synchronized(Counter.class) {

count ++;

//}

}

publicstaticvoidmain(String[] args)throwsInterruptedException {

finalCountDownLatch latch =newCountDownLatch(1000);

//同时启动1000个线程,去进行i++计算,看看实际结果

for(inti =0; i <1000; i++) {

newThread(newRunnable() {

@Override

publicvoidrun() {

Counter.inc();

latch.countDown();

}

}).start();

}

latch.await();

//这里每次运行的值都有可能不同,可能为1000

System.out.println(“运行结果:Counter.count=”+ Counter.count);

}

}

可以看到,运行结果:Counter.count=929(数字随机),但如果将注释掉的同步块synchronized打开,console输出则为1000

2.synchronized

它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

五、以上规则对其它对象锁同样适用.

3:AtomicInteger

使用AtomicInteger,即使不用同步块synchronized,最后的结果也是1000,可用看出AtomicInteger的作用,用原子方式更新的int值。主要用于在高并发环境下的高效程序处理。使用非阻塞算法来实现并发控制。

publicclassCounter {

publicstaticAtomicInteger count =newAtomicInteger(0);

publicstaticvoidinc() {

//这里延迟1毫秒,使得结果明显

try{

Thread.sleep(1);

} catch(InterruptedException e) {

}

count.getAndIncrement();

}

publicstaticvoidmain(String[] args)throwsInterruptedException {

finalCountDownLatch latch =newCountDownLatch(1000);

//同时启动1000个线程,去进行i++计算,看看实际结果

for(inti =0; i <1000; i++) {

newThread(newRunnable() {

@Override

publicvoidrun() {

Counter.inc();

latch.countDown();

}

}).start();

}

latch.await();

//这里每次运行的值都有可能不同,可能为1000

System.out.println(“运行结果:Counter.count=”+ Counter.count);

}

}

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132535.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • OV7725寄存器配置_i2c总线通信距离

    OV7725寄存器配置_i2c总线通信距离OV7725寄存器配置(为了替换NT99141研究了很长一段时间)部分参考链接:OV7725电器特性和时序图:https://www.cnblogs.com/raymon-tec/p/5087088.htmlOV7725摄像头的彩色图像采集原理与液晶显示(有必要了解框图):https://blog.csdn.net/huzhoudaxia/article/details/75269392…

    2022年9月24日
    0
  • 云计算与大数据技术应用 第四章课后答案_云计算原理与实践

    云计算与大数据技术应用 第四章课后答案_云计算原理与实践数据中心数据中心的概念数据中心,顾名思义就是数据的中心,是处理和存储海量数据的地方,英文全称为DataCenter。用专业的名词解释,数据中心是全球协作的特定设备网络,用来在internet网络基础设施上传递、加速、展示、计算、存储数据信息。尽管数据中心听起来神秘高大上,但按照最简单直接的理解,数据中心实际上就是我们个人电脑的扩大版,你的家用电脑就是你个人的数据中心。一般来讲,数据中心主要有几大部分构成:机房(建筑物本身)、供配电系统、制冷系统、网络设备、服务器设备、存储设备等。那数据中心的这些构成模

    2022年10月5日
    0
  • mac datagrip激活教程_最新在线免费激活

    (mac datagrip激活教程)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年3月31日
    79
  • idea激活码2021.10_最新在线免费激活「建议收藏」

    (idea激活码2021.10)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSWQi…

    2022年3月27日
    63
  • 图解Windows Server服务器上DNS服务器配置

    图解Windows Server服务器上DNS服务器配置图解WindowsServer服务器上DNS服务器配置听语音  | 浏览:1385 | 更新:2018-04-0319:58 1 2 3 4 5 6 7 分步阅读本篇经验将和大家介绍WindowsServer服务器上DNS服务器配置的步骤,希望对大家的工作和学习有所帮助!DNS服务器安装 1…

    2022年5月26日
    39
  • linux运维面试题大厂,大厂Linux运维面试题详解「建议收藏」

    linux运维面试题大厂,大厂Linux运维面试题详解「建议收藏」大厂面试题:网络基础类面试题01.Linux运维经典面试题_网络基础-视频介绍02.Linux运维经典面试题_网络基础-面试题103.Linux运维经典面试题_网络基础-面试题204.Linux运维经典面试题_网络基础-面试题3Linux系统管理类面试题05.Linux运维经典面试题_Linux系统管理类-权限优化06.Linux运维经典面试题_Linux系统管理类-备份策略07.Linux运维经…

    2022年5月27日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号