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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 8位双向移位寄存器verilog设计

    8位双向移位寄存器verilog设计系统功能设计一个8位双向移位寄存器,实现并行输入数据、数据左移、右移、清空数据的功能。程序主要包括移位寄存器模块和按键去抖模块①Key1控制拨码输入:a)key_flag1,key_state1实现Key1去抖(if(key_flag1&&(!key_state1)));b)key_cnt[3:0]从0开始在每一次Key1按下后加1,累积到3后再按下Key1,key_cnt清零;c)en_num1为高4位输入使能信号,en_num2为低4位输入使能信

    2022年7月16日
    15
  • 做电商网站服务器在哪里,电商网站服务器如何选择「建议收藏」

    做电商网站服务器在哪里,电商网站服务器如何选择「建议收藏」网络上的电商人数越来越多,那么现在我们做电商还有的做嘛!其实,还是有机会的,这里面有两个关键点,一是所提供的产品及服务、另一个是别人访问我们网站时的感觉,也就相关到电子商务网站网站服务器。使用电子商务网站网站服务器前提,做好网络市场环境分析网络市场的贸易方式有多种,B2B、B2C、B2G、C2C、O2O等,每位卖方都是借助这些方式使用网络工具在网络上进行产品的宣传推广,展现自家产品,提供给所需的…

    2022年9月30日
    2
  • 开源许可证的选择

    开源许可证的选择

    2021年8月15日
    61
  • fastjson中jsonarray转list

    fastjson中jsonarray转listhttps://www.jianshu.com/p/d06dec564459

    2022年6月23日
    34
  • C PictureBox 图片控件

    C PictureBox 图片控件图片控件中常用的属性如下表所示 图片控件中图片的设置除了可以直接使用 ImageLocatio 属性指定图片路径以外 还可以通过 Image FromFile 方法来设置 实现的代码如下 图片控件的名称 Image Image FromFile 图像的路径 实例 实现图片交换 Form1

    2025年7月7日
    2
  • pycharm安装tensorflow等各种三方库失败,解决方案[通俗易懂]

    pycharm安装tensorflow等各种三方库失败,解决方案[通俗易懂]参考以下三个回答:https://blog.csdn.net/xiao_xian_/article/details/88181845解决pycharm导入三方库得方法https://blog.csdn.net/weixin_41923961/article/details/86584683解决pycharm+anaconda环境导入方法https://blog.csdn.ne…

    2022年8月26日
    6

发表回复

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

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