理解并解决Java多线程并发问题实例

原创 Dear 丶 2024-09-26 09:33 164阅读 0赞

在Java中,多线程并发问题主要体现在共享资源的访问、同步机制的应用以及竞态条件等。

以下是一个具体的实例来理解这些问题:

  1. 共享资源访问
    ```java
    class Counter {
    int count;

    synchronized void increment() {

    1. count++;
    2. notifyAll(); // 通知所有等待的线程

    }

    synchronized void decrement() {

    1. count--;
    2. if (count == 0) { // 如果计数为0,进入休眠状态
    3. try {
    4. wait();
    5. } catch (InterruptedException e) {
    6. e.printStackTrace();
    7. }
    8. }

    }
    }

// 多个线程同时访问共享资源
class WorkerThread extends Thread {
private Counter counter;

  1. public WorkerThread(Counter counter) {
  2. this.counter = counter;
  3. }
  4. @Override
  5. public void run() {
  6. while (true) { // 无限循环,模拟工作状态
  7. try {
  8. counter.increment(); // 增加计数
  9. System.out.println("Work done by thread " + this.getName()); // 打印工作完成信息
  10. Thread.sleep(100); // 等待一段时间再执行下一条语句
  11. } catch (InterruptedException e) {
  12. System.out.println(this.getName() + ": Interrupted while sleeping!"); // 当线程被中断时,打印日志
  13. e.printStackTrace();
  14. }
  15. }
  16. }

}

public class Main {
public static void main(String[] args) {
Counter counter = new Counter();

  1. // 创建并启动多个工作线程
  2. for (int i = 0; i < 5; i++) {
  3. WorkerThread workerThread = new WorkerThread(counter);
  4. workerThread.setName("Thread " + i); // 设置线程名称
  5. workerThread.start(); // 启动线程
  6. }
  7. // 确保所有工作线程完成其任务后,主线程再执行其他操作
  8. System.out.println("All worker threads completed their tasks."); // 打印日志,表示所有工作线程已经完成它们的任务
  9. }

}
```

在这个例子中,我们创建了一个共享的Counter对象。多个线程(WorkerThread)同时访问这个Counter,模拟多线程并发情况。

通过设置适当的同步机制(如synchronized关键字),我们可以避免竞态条件导致的问题,并确保所有操作按照预期进行。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读