多线程并发问题:Java线程安全问题实例
Java中的线程安全问题主要发生在共享资源访问不当时。以下是一个具体的实例:
例1:多个线程同时修改一个集合
import java.util.ArrayList;
import java.util.List;
public class ThreadSafeExample {
private List<String> sharedList = new ArrayList<>();
public void addString(String str) {
// 不安全的添加方式
sharedList.add(str);
}
public List<String> getSharedList() {
return sharedList;
}
public static void main(String[] args) {
ThreadSafeExample example = new ThreadSafeExample();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
example.addString("Thread " + i);
}
}));
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
if (i == 1) {
// 模拟线程同步,阻止对共享资源的访问
synchronized (example.getSharedList()) {
example.addString("Thread " + i);
}
} else {
example.addString("Thread " + i);
}
}
}));
thread1.start();
thread2.start();
// 等待两个线程完成操作
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Shared List: " + example.getSharedList()));
}
}
在这个例子中,我们创建了两个线程(thread1和thread2),它们同时修改一个共享的ArrayList<String>
。
由于我们在添加字符串时没有对共享资源进行同步,这就可能导致数据不一致或线程安全问题。
还没有评论,来说两句吧...