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


相关推荐

  • Marlin2.0.9 Configuration_adv.h详解

    Marlin2.0.9 Configuration_adv.h详解/**Marlin3DPrinterFirmwareCopyright©2020MarlinFirmware[https://github.com/MarlinFirmware/Marlin]BasedonSprinterandgrbl.Copyright©2011CamielGubbels/ErikvanderZalmThisprogramisfreesoftware:youcanredistributeitand/ormodif

    2022年7月15日
  • 使用zlib/gzip压缩和解压缩?(Flash和GALGAME使用的压缩格式)[通俗易懂]

    使用zlib/gzip压缩和解压缩?(Flash和GALGAME使用的压缩格式)[通俗易懂]c#下怎么使用zlib? zlib是开源的压缩格式 源代码和DLL可以去http://www.zlib.net/  bzip2是建立在libbzip2 激活成功教程GALGAME时候很多人发现许多游戏系统都采用这种压缩格式 甚至Flash格式版本6以后,增加了可压缩选项,用的是ZLib压缩(wxd:jrj.com.cn金融界flash数据就是这样,减少传输量) 我今天看过金山词霸2009毫无疑问的使用ZLib和bzip2 那么编写解压缩或者压缩程序显得很重要 对于C++程序员来说,很简单,把DLL导入

    2022年7月16日
  • linux杀掉mysql进程_linux杀死pid进程

    linux杀掉mysql进程_linux杀死pid进程使用“ps-e|grepmysql”命令,查看mysql程序的对应的pid号。使用“kill-9进程号”命令,可以结束掉mysqld_safe进程。使用”killallmysqld”命令,可以杀掉所有已mysqld命名的进程。…

    2022年9月1日
  • 上delloc 无呼叫 故障排除 笔记[通俗易懂]

    上delloc 无呼叫 故障排除 笔记

    2022年1月17日
  • pytest的使用_实例方法只能用实例来调用

    pytest的使用_实例方法只能用实例来调用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年8月6日
  • 4个基本不等式的公式高中_高中4个基本不等式的公式

    4个基本不等式的公式高中_高中4个基本不等式的公式高中4基本不等式:√[(a2+b2)/2]≥(a+b)/2≥√ab≥2/(1/a+1/b)。平方平均值≥算术平均数≥几何平均数≥调和平均数。基本不等式的两个技巧“1”使用。如果标题中有两个公式,则它们之和为常数,要求这两个公式的倒数之和的最小值,常用所把这个公式乘以1,然后把1让我们使用上一个常量,可以通过扩展这两个公式来计算。如果你知道两个公式的倒数之和是常数,求两个公式之和的最小值,方法同上。…

    2022年4月27日

发表回复

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

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