Java中的内存一致性错误
当实现多线程的概念时,一个线程所做的更改可能对另一个线程不可见。这表明每个线程的视图彼此不一致。这被称为内存一致性错误。
CPU可能以不同的顺序发起主内存访问,而线程可能以不同的顺序访问它们。
当执行写操作时,这通常是正确的,从而避免了CPU等待时间。
写操作是原子操作,这意味着在执行写操作时,其他线程不会执行任何其他操作。
除此之外,写操作执行的顺序对于每个关联的CPU将保持一致,而CPU可以以不同的方式理解其他CPU的写时间。这种现象可能导致内存不一致。
如何避免内存不一致错误?
需要建立一个“先行发生”关系,以便由单个线程执行内存写入,并且这对于其他线程对同一内存执行的读取操作可见。
“start”函数和“join”函数被认为是先行发生关系。“start”函数确保新创建的线程可见。“join”函数确保可见的线程已加入到其他线程。
示例
import java.io.*;
class class_shared{
static int m=2;
void inc(){
for(int j=0;j<5;j++){
m = m+1;
System.out.println("After its increment is "+m);
}
}
void dec(){
for(int j=0;j<5;j++){
m = m-1;
System.out.println("After its decrement is "+m);
}
}
}
public class Demo{
public static void main(String[] args){
final class_shared my_inst = new class_shared();
Thread my_t_1 = new Thread(){
@Override
public void run(){
my_inst.inc();
}
};
Thread my_t_2 = new Thread(){
@Override
public void run(){
my_inst.dec();
}
};
my_t_1.start();
my_t_2.start();
}
}输出
After its increment is 3 After its decrement is 2 After its decrement is 2 After its decrement is 1 After its increment is 3 After its decrement is 0 After its increment is 1 After its increment is 1 After its decrement is 0 After its increment is 2
名为“class_shared”的类定义了一个静态值和一个void函数,该函数迭代一组数字,递增它并在控制台上显示它。另一个名为“dec”的函数迭代一组数字,每次递减并显示控制台上的输出。名为Demo的类包含创建类实例并创建新线程的主函数。此线程被覆盖,并且在此对象实例上调用run函数。第二个线程也执行相同的操作。然后使用“start”函数调用这两个线程。
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP