java 引用赋值是原子操作吗
java中一般事务管理里面用到原子操作。
详细分析如下:
原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征;
使用原子操作的好处:
⑴. 性能角度:它执行多次的所消耗的时间远远小于由于线程所挂起到恢复所消耗的时间,因此无锁的CAS操作在性能上要比同步锁高很多;
⑵. 业务需求:业务本身的需求上,无锁机制本身就可以满足我们绝不多数的需求,并且在性能上也可以大大的进行提升。
例子:我们使用的版本控制工具与之其实非常的相似,如果使用锁来同步,其实就意味着只能同时一个人对该文件进行修改,此时其他人就无法操作文件,如果生活中真正遇到这样的情况我们一定会觉得非常不方便,而现实中我们其实并不是这样,我们大家都可以修改这个文件,只是谁提交的早,那么他就把他的代码成功提交的版本控制服务器上,其实这一步就对应着一个原子操作,而后操作的人往往却因为冲突而导致提交失败,此时他60问答必须重新更新代码进行再次修改,重新提交。 |||原子操作(atomic operation)是来自不需要synchronized,所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch;
java中一般事务管理里面用到原子操作。
详细分析如下:
原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征;
使用原子操作的好处:
⑴. 性能角度:它执行多次的所消耗的时间远远小于由于线程所挂起到恢复所消耗的时间,因此无锁的CAS操作在性能上要比同步锁高很多;
⑵. 业务需求:业务本身的需求上,无锁机制本身就可以满足载获按谁研额走减引视染我们绝不多数的需求,并且在性能上也可以大大的进行提升。
例子:我们使用的版本控制工具与之其实非常的相似,如果使用锁来同步,其实就意味着只能同时一个人对该文件进行修改,此时其他人就无法操作文件,如果生活中真正遇到这样的情况我们一定会觉得非常不方便,而现实中我们其实并不是这样,我们大家都可以修改这个文件,只是谁提交的早,那么他就把他的代码成功提交的版本控制服务器上,其实这一步就对应着一个原子操作,而后操作的人往往却因为冲突而导致提交失败,此时他必须重新更新代码进行再次修改,重新提交。 |||由一个简单的例子引出并发处理时容易被忽视的陷阱,用来作为面试问题应该很适合。
某日,工作了 4 年多的 Java 程序员小 K 跳槽,面试时碰到这样一个题目....
public class P1 {
private long b = 0;
public void set1() {
b = 0;
}
public void set2() {
b = -1;
}
public void check() {
println(b);
if (0 != b && -1 != b) {
println("Error");
}
}
}
问题
调用 set1()、set2()、check(),会打印出 Error 么?
小K 的推理
“无论如何调用 set1()、set2() - b 的值只可能是 0 或 -1 - 在 check() 里面的判断条件(b 既不为 0 也不为 -1)永远不成立 - 不打印 Error”
小 K 觉得有坑:这题目应该不会这么简单,再考虑一下多线汽富控搞前司袁程环境。
思前想后,小 K 得出结论:“在多线程环境下也不会打印 Error。这题目很简单听波怎见,就是考察一下推理吧。”,K 暗自窃喜。
后来小 K 陆续又被问了几个多线程和 JVM 的问题。
后来,就没有后来了.形改...
后来
后来还是有的。到家后,不甘心的小 K 验证了这道秒杀他的面试题。
public static void main(final String[] args) {
final P1 v = new P1();
// 线程 1:设置 b = 0
final Thread t1 = new Thread() {
public void run() {
while (true) {
v.set1();
}
};
};
t1.start();
// 线程 2:设置 b = -1
final Thread t2 = new Thread() {
public void run() {
while (true) {
v建且物叶危奏航宁振.set2();
}
};
};
t2.start();
// 线程 :检查 0 != b && -1 != b
final Thread t = new Thread() {
public void run() {
while (true) {
();
}
};
};
t.start();
}
使用 个线程分别重复执行 set1()、set2()、check()。执行输出结果部分如下:
....
0
0
1
1
1
Error
Error
-4294967296
0
0
4294967295
....
执行环境:
Java(TM) SE Runtime Environment (build 1.6.0_1-b05)
Java HotSpot(TM) Client VM (build 20.6-b01, mixed mode, sharing), 2bit
“确实打印了 Error,并且打印了 4294967295、-4294967296。我勒个去,只是啥情况?”
小 K 决定搞懂其中奥秘,重新审视了题目。以一个专业程序员的严谨,并经过无数次 Google 后....他似乎发现了问题所在。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:新款帕萨特门把手肿么拆
推荐阅读
留言与评论(共有 12 条评论) |
本站网友 公司自行清算 | 11分钟前 发表 |
并且在性能上也可以大大的进行提升 | |
本站网友 珍奥核酸 | 11分钟前 发表 |
此时其他人就无法操作文件 | |
本站网友 上海58同城 | 13分钟前 发表 |
2bit “确实打印了 Error | |
本站网友 修复霜 | 21分钟前 发表 |
后来小 K 陆续又被问了几个多线程和 JVM 的问题 | |
本站网友 大学城美食 | 29分钟前 发表 |
check() | |
本站网友 绍兴个人二手房网 | 12分钟前 发表 |
无锁机制本身就可以满足载获按谁研额走减引视染我们绝不多数的需求 | |
本站网友 桌面锁定软件 | 23分钟前 发表 |
执行输出结果部分如下:....00111ErrorError-4294967296004294967295....执行环境: Java(TM) SE Runtime Environment (build 1.6.0_1-b05) Java HotSpot(TM) Client VM (build 20.6-b01 | |
本站网友 于泳 | 15分钟前 发表 |
就一直运行到结束 | |
本站网友 孕妇中期食谱 | 1分钟前 发表 |
例子:我们使用的版本控制工具与之其实非常的相似 | |
本站网友 快速美白的办法 | 12分钟前 发表 |
其实这一步就对应着一个原子操作 | |
本站网友 哪里整容好 | 28分钟前 发表 |
只是谁提交的早 |