java voliate_Java之voliate, synchronized, AtomicInteger使用
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);
}
}
java voliate_Java之voliate, synchronized, AtomicInteger使用相关推荐
- java基础-CAS、synchronized和AQS的理解
乐观锁与悲观锁的区别? 悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程 ...
- JAVA多线程之Synchronized、wait、notify实例讲解
一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- java并发中的Synchronized关键词
文章目录 为什么要同步 Synchronized关键词 Synchronized Instance Methods Synchronized Static Methods Synchronized B ...
- Java并发编程:synchronized
虽然多线程编程极大地提高了效率,但是也会带来一定的隐患.比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据.今天我们就来一起讨论下线程安全问题,以及Java中提供 ...
- Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock
努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...
- 【线程同步】 Java 同步块(synchronized)详细说明
我们在java开发中常常用synchronized( 互斥锁)来进行同步,但是对于 synchronized关键字有那些用法,会产生什么样的效果却不一定清楚,下面将详细介绍synchronized在程 ...
- java synchronized 卖票_(二)java多线程之synchronized
引言 现在,让我们来考虑一个问题,如果要让多个线程来访问同一份数据,会发生什么现象呢?比如12306的火车售票系统,比如银行的存取款系统等等.都可以会出现多线程访问同一个数据的情况.让我们先模拟写一个 ...
- Java多线程之Synchronized深入理解
文章目录 1 Synchronized 1.1 引言 1.2 概念理解 1.2.1 不同锁对象 1.2.2 对象锁和类锁概念区别 1.2.3 同步概念monitorenter&monitore ...
最新文章
- Redis持久化 - RDB和AOF
- 转载: EMD(Emprical mode decomposition)经验模态分解
- 聊聊wiki和中华维客
- kaggle 房价预测经典文章
- python条件替换_python-根据其他列中的条件替换pandas列中的某些特定值
- oracle expdp数据到txt,[20130727]ORACLE 12C使用expdp导出view数据.txt
- SAP Spartacus在没有修改用户名和密码的前提下,出现登录错误的原因
- Remove Extra One(思维)
- python火柴人打架代码_python火柴人
- java泛型实例化_java基础-泛型举例详解
- JavaScript 高级程序设计笔记
- android 投屏原理图,什么是投屏功能,手机投屏原理介绍
- 线性同余法生成随机数Matlab_生成安全的随机数
- 傻瓜式c语言教程,app制作教程简单易学:傻瓜简单自建app,步骤如下
- 工程图学与计算机绘图考查,工程图学与计算机绘图
- 数据结构(一):数组
- PS · class 1
- 携程校招——携程海洋馆的海豚小宝宝(C++)
- 嵌入式系统开发笔记17:CJ/T-188 冷热量表协议解析6
- (转)loff_t *ppos是什么东东