ackage step2; public class Task { public static void main(String[] args) { final insertData insert = new insertData(); for (int i = 0; i < 3; i++) { new Thread(new Runnable() { public void run() { insert.insert(Thread.currentThread()); } }).start(); } } } class insertData{ public static int num =0; /********* Begin *********/ public void insert(Thread thread){ for (int i = 0; i <= 5; i++) { num++; System.out.println(num); } } /********* End *********/ }
时间: 2025-06-05 09:33:01 浏览: 5
### Java多线程共享变量线程安全同步机制示例
在Java多线程环境中,当多个线程同时访问和修改共享变量时,可能会导致数据不一致的问题。为了解决这一问题,Java提供了多种线程同步机制,其中最常用的是使用`synchronized`关键字来确保同一时间只有一个线程能够执行特定的代码块或方法[^1]。
以下是一个关于如何通过同步机制解决多线程环境下共享变量`num`的线程安全问题的示例:
#### 示例代码:使用同步代码块
```java
public class SharedVariableExample {
public static void main(String[] args) {
// 创建资源对象
Counter counter = new Counter();
// 创建多个线程操作共享资源
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
}, "Thread-1");
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
}, "Thread-2");
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final value of num: " + counter.getNum());
}
}
// 资源类
class Counter {
private int num = 0;
// 同步方法
public synchronized void increment() {
num++;
}
public int getNum() {
return num;
}
}
```
#### 示例代码:使用同步代码块替代同步方法
如果不想直接对整个方法加锁,也可以选择使用同步代码块的方式,这种方式可以更精确地控制锁的范围[^4]。
```java
class Counter {
private int num = 0;
// 使用同步代码块
public void increment() {
synchronized (this) {
num++;
}
}
public int getNum() {
return num;
}
}
```
#### 注意事项
1. 在上述示例中,`synchronized`关键字确保了同一时间只有一个线程能够进入`increment`方法或同步代码块,从而避免了多个线程同时修改共享变量`num`导致的数据不一致问题。
2. 如果将共享变量`num`声明为静态变量,则需要将锁对象改为`Counter.class`,因为静态变量属于类而不是实例[^3]。
3. 线程同步虽然解决了线程安全问题,但也可能带来性能开销。因此,在实际开发中需要权衡是否需要同步以及如何优化同步逻辑[^1]。
###
阅读全文
相关推荐















