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


相关推荐

  • iOS开发常用国外网站清单

    iOS开发常用国外网站清单工欲善其事必先利其器,最近发现临时查找一些东西容易浪费时间,花了点时间整理一下常用的网站,方便以后备用。国内的code4app,ui4app,cocoachina,oschina,csdn就不说了,基本上很好用。不过国外网站上的好东西更多,可惜找起来也更费时间,需要整理一下。主要分开发教程、示例项目、UI设计、问题解决几块。开发教程:即便过了入门阶段,还是要

    2022年7月12日
    19
  • vue axios跨域问题的三种解决方案_vue如何实现跨域

    vue axios跨域问题的三种解决方案_vue如何实现跨域vue3项目,axios跨域处理,代理

    2025年9月6日
    6
  • ANSI编码简述_ansi格式编码

    ANSI编码简述_ansi格式编码前情提要美国人最先用电脑,发明了足够他们使用的ASCII编码(127个,1个字节都没用完)。后来欧洲人发现127个不太够,把ASCII没用完的位置用上了(拓展字符集),还叫ASCII。再后来中国想用电脑打汉字,显然256个就太不够了,于是产生了GB2312,GBK,GB18030以及港澳台地区的Big5。此外韩国也有自己韩EUC-KR。ANSI编码为了保证Windows在不同语言文字的国家都能用。微软采用了标准代码页(CodePage,代码页是字符集编码的

    2022年9月23日
    2
  • Vue组件通信_android组件间通信

    Vue组件通信_android组件间通信Vue组件通信

    2025年8月23日
    4
  • TranslateMessage和DispatchMessage作用[通俗易懂]

    TranslateMessage和DispatchMessage作用[通俗易懂]PostMessage是将消息放入到窗体的消息队列中,窗体过程需要等待一段时间,以便从队列中取出了消息之后,才处理消息SendMessage不将消息放入消息队列,而只是把直接让窗体过程处理这个消息,所以消息一般能立刻响应。TranslateMessage函数是将消息转化成某一个,或更多的消息,比如,当消息循环接收一个WM_KEYDOWN消息时,如果用户按下了字母键,那么Translat

    2025年9月11日
    7
  • 碰撞检测经典解决方案

    碰撞检测经典解决方案碰撞检测在3D游戏中至关重要,好的碰撞检测要求人物在场景中可以平滑移动,遇到一定高度内的台阶可以自动上去,而过高的台阶则把人挡住,遇到斜率较小的斜坡可以上去,斜率过大则把人挡住,在各种前进方向被挡住的

    2022年7月3日
    38

发表回复

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

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