理解有误:Java多线程同步问题示例
在Java中,多线程的同步问题是常见的并发挑战。以下是一个简单的示例来解释这些同步问题:
互斥锁:
// 示例代码:两个线程交替打印数字
class Counter {
private int count = 0;
Lock lock = new ReentrantLock();
public synchronized void increment() {
count++;
lock.unlock(); // 在释放锁之前更新了计数器
lock.lock(); // 然后再次锁定,以防止其他线程在此期间访问
}
public synchronized int getCount() {
return count;
}
}
条件变量:
class PrintNumber extends Thread {
private Counter counter;
boolean printFlag = false;
PrintNumber(Counter c) {
this.counter = c;
}
@Override
public void run() {
while (true) { // 无限循环,直到中断
if (printFlag) { // 等待条件满足(打印数字)
counter.increment();
printFlag = false; // 调整标志位,不再等待
} else { // 如果不需要打印,则等待
try {
wait(); // 调用wait()方法,进入等待状态
} catch (InterruptedException e) {
// 处理中断异常
}
}
}}
}
}
synchronized块/方法:
class WorkerThread extends Thread {
private Counter counter;
WorkerThread(Counter c) {
this.counter = c;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) { // 每次循环,都会尝试增加计数器
if (counter.getCount() == 5) { // 当计数器达到5时,会打印数字并继续循环
System.out.println("Number printed: " + i);
counter.increment(); // 增加计数器,为下次条件满足做准备
break; // 跳出当前循环
}
}
}
}
通过这些示例,可以理解Java多线程同步问题的处理方式和常见解决方案。
还没有评论,来说两句吧...