实例演示:Java多线程编程的同步问题
在Java中,多线程编程中的同步问题是由于共享资源的存在,当多个线程同时访问这些资源时,可能会引发竞态条件、死锁等问题。
这里以简单的生产者消费者模型为例,演示同步问题:
// 定义共享资源
class Buffer {
int[] list = new int[10];
boolean empty = true;
// 添加元素到列表尾部
void add(int num) {
if (empty) {
list[0] = num;
empty = false;
notifyAll(); // 通知所有等待的线程
} else {
list[empty--] = num;
}
}
// 获取并移除列表头部元素
int remove() {
if (!empty) {
throw new IllegalStateException("Buffer is empty");
}
int num = list[0];
list[0] = 0; // 清空位置
empty = true;
notifyAll(); // 通知所有等待的线程
return num;
}
}
// 生产者线程
class ProducerThread implements Runnable {
private Buffer buffer;
public ProducerThread(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
while (true) { // 模拟生产过程
buffer.add(10 + Math.random()));
try {
Thread.sleep(50); // 暂停50毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 消费者线程
class ConsumerThread implements Runnable {
private Buffer buffer;
public ConsumerThread(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
while (true) { // 模拟消费过程
int num = buffer.remove(); // 获取并移除列表头部元素
if (num != 10 + Math.random()) {
System.out.println("Error: Consumed number does not match expected");
} else {
System.out.println("Consumed number: " + num);
}
try {
Thread.sleep(50); // 暂停50毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 主程序
public class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer();
// 创建生产者和消费者线程
Thread producerThread = new Thread(new ProducerThread(buffer)));
Thread consumerThread = new Thread(new ConsumerThread(buffer)));
// 启动线程
producerThread.start();
consumerThread.start();
// 等待所有线程执行完毕
try {
producerThread.join();
consumerThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这个程序中,Buffer
类代表一个共享资源。生产者和消费者线程同时访问并修改这个资源。
当多个线程尝试同时对同一个资源进行操作时,就可能出现同步问题,例如数据不一致、死锁等。
还没有评论,来说两句吧...