IDEA中怎么设置项目更改后的分析延迟时间,IDEA是java编程语言的集成开发环境,使用该软件编写代码时,可以设置项目更改后的分析延迟时间,这样就可确保项目范围分析的正确性,具体的操作步骤如下。......
2023-07-04 579 JAVA
并发BUG主要是以下3个问题带来的:
1、CPU缓存带来的可见性问题
2、线程切换带来的原子性问题
3、编译优化带来的有序性问题
可见性问题:主要是由CPU缓存带来的。
1)CPU缓存主要是用以均衡与内存的速度差异,但同时也带来了问题。
2)在单核时代,仅有一个CPU缓存,也就没有可见性问题,多核CPU,每个CPU都有自己的缓存,会导致在进行CPU操作时,内存数据与CPU缓存不一致。
3)如图,多核CPU的缓存与内存的关系图:
原子性问题:主要是线程切换带来的。
1)操作系统增加进程、线程,以分时复用CPU,进而均衡CPU与I/O设备的速度差异。
2)我们把一个或者多个操作在CPU执行的过程中不被中断的特性称为原子性。3)CPU 能保证的原子操作是 CPU 指令级别的,而不是高级语言的操作符。
4)如图:线程切换示意图。
5)举例,我们常见的执行+1操作,count为共享变量。
有序性问题:编译优化带来的问题。
举例,double check,代码如图所示。
过程分析:线程A执行getInstance()方法,假设此时instance==null,线程A获得锁,进入代码块,由于编译优化(会将地址赋值放在前面,初始化放在后面),分配内存M,instance=&M,此时发生线程切换,线程A还是持有该类对象的锁,线程B执行if (instance == null) ,内存存在,instance为null不成立,直接return instance;但是此时instance还未初始化完成,只有分配了一块内存M,因此返回了一个未初始化的instance。
public class Singleton {
static Singleton instance;
static Singleton getInstance(){
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!
标签: JAVA
相关文章
IDEA中怎么设置项目更改后的分析延迟时间,IDEA是java编程语言的集成开发环境,使用该软件编写代码时,可以设置项目更改后的分析延迟时间,这样就可确保项目范围分析的正确性,具体的操作步骤如下。......
2023-07-04 579 JAVA
IDEA中怎么设置调试器最近表达式的最大数量,IDEA是java编程语言的集成开发环境,使用该软件编写代码时,可以设置调试器最近表达式的最大数量,从而有效避免调试器中表达式存储过多。......
2023-07-04 401 JAVA