解决Java并发控制不当的示例

原创 冷不防 2024-10-07 07:54 101阅读 0赞

在Java中,如果并发控制不当,可能会导致数据不一致、死锁等问题。以下是一个简单的示例,展示了如何通过不当的并发控制导致问题:

  1. // 创建两个共享资源的线程
  2. class ResourceThread extends Thread {
  3. private int resource;
  4. ResourceThread(String name, int resource) {
  5. super(name);
  6. this.resource = resource;
  7. }
  8. public synchronized void consumeResource() {
  9. if (resource > 0) {
  10. resource--;
  11. notifyAll(); // 唤醒等待的线程
  12. }
  13. }
  14. }
  15. // 创建两个资源消耗线程
  16. ResourceThread thread1 = new ResourceThread("Thread1", 10);
  17. ResourceThread thread2 = new ResourceThread("Thread2", 5);
  18. // 启动线程
  19. thread1.start();
  20. thread2.start();
  21. // 在这里等待,直到资源都被消耗完
  22. while (thread1.isAlive() || thread2.isAlive()) {
  23. try {
  24. // 线程会在这里睡眠,直到被唤醒
  25. Thread.sleep(100);
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. }

在这个示例中,两个线程同时尝试消费资源。由于使用了synchronized关键字来保护共享资源的访问,所以只有一个线程能成功消耗资源。

然而,在不恰当的情况下,如线程数量超过资源的数量,或者使用非公平锁(例如ReentrantLock的默认行为)时,可能会导致死锁或者其他并发问题。

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

发表评论

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

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

相关阅读

    相关 解决Java并发控制不当示例

    在Java中,如果并发控制不当,可能会导致数据不一致、死锁等问题。以下是一个简单的示例,展示了如何通过不当的并发控制导致问题: ```java // 创建两个共享资源的线程