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);

}

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 卷积神经网络(CNN)与深度卷积神经网络(DCNN)

    卷积神经网络(CNN)与深度卷积神经网络(DCNN)作为小白,看到DCNN,一直想知道与CNN的区别,也没找到明确的说法,以下是自己的一点想法,欢迎指正!目录一、CNN与DCNN二、基于pytorch的实现1.LeNet-52.AlexNet一、CNN与DCNN卷积神经网络,如:LeNet深度卷积神经网络,如:AlexNetAlexNet与LeNet结构类似,但使用了更多的卷积层和更大的参数空间来拟合大规模数据集ImageNet。卷积神经网络就是含卷积层的网络。AlexNet是浅层神经网络和深度神经网络的分界..

  • Python爬虫数据抽取(三):pyquery库「建议收藏」

    Python爬虫数据抽取(三):pyquery库「建议收藏」目录1.基本用法2.实战:抓取当当图书排行榜1.基本用法test.html代码如下:<div><divid=”panel”><ulclass=”list1″><liclass=”item”value1=”1234″value2=”helloworld”><ahref=”https://geekori.com”>geekori.com<a>ok</a

  • IDEA 激活码 2022年到期破解方法

    IDEA 激活码 2022年到期破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”   就拿剪发办卡的事情来分析一下吧。   首先,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦。   那么,总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用

  • 使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)

    使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)zhuan:https://segmentfault.com/a/1190000002697929本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称P2V。采用

  • 深入解析 Java集合类ArrayList与Vector的区别

    深入解析 Java集合类ArrayList与Vector的区别集合类分为两个分支,Collection与Map,其中Collection接口继承了Iterator接口,继承Iterator接口的类可以使用迭代器遍历元素(即Collection接口的类都可以使用),今天我们从相同点、不同点、以及JDK源码等各个方面来深入解析下,底层使用数组实现的两个集合类:ArrayList与Vector的区别与联系区别与联系:1.ArrayList出现于jdk1…

发表回复

您的电子邮箱地址不会被公开。

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