实战讲解:Java中的同步锁和死锁问题案例

原创 旧城等待, 2024-10-19 11:36 82阅读 0赞

在Java编程中,同步锁和死锁是并发编程中的重要概念。

  1. 同步锁(Synchronized)

    • synchronized关键字用于修饰方法或代码块,使得同一时间只有一个线程可以访问这些资源。
    • 常见的同步方式有:使用对象作为锁,如objectLock = new Object();后的方法调用前加上synchronized(objectLock) { ... }
  2. 死锁(Deadlock)

    • 死锁是多个线程在执行过程中因争夺资源而造成的一种互相等待的现象,若无外力干涉,它们都将无法推进执行。

    • 在Java中,避免死锁的方法通常包括明确的资源分配顺序(即资源的”等待链”结构),使用java.util.concurrent.locks.LockCondition来管理线程对资源的访问,以及在必要时使用显式解锁。

实战案例:

  1. // 创建两个共享对象,模拟资源
  2. Object resource1 = new Object();
  3. Object resource2 = new Object();
  4. // 使用Synchronized修饰方法,获取锁并操作资源
  5. public void operationResource(Object resource) {
  6. synchronized (resource) { // 获取资源锁
  7. System.out.println("线程正在操作:" + resource);
  8. // 模拟耗时操作
  9. try {
  10. Thread.sleep(500); // 暂停500毫秒
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. // 执行完成后释放锁
  15. resource.notifyAll(); // 唤醒所有等待资源的线程
  16. System.out.println("操作完成,线程继续执行...");
  17. }
  18. }
  19. }
  20. public class Main {
  21. public static void main(String[] args) {
  22. // 创建两个线程并分配资源
  23. Thread thread1 = new Thread(() -> operationResource(resource1))));
  24. Thread thread2 = new Thread(() -> operationResource(resource2))));
  25. // 启动线程
  26. thread1.start();
  27. thread2.start();
  28. System.out.println("主线程等待线程执行完毕...");
  29. }
  30. }

这个案例中,两个共享资源resource1resource2被分配给两个线程。通过使用synchronized关键字锁定了每个资源,保证了在同一时间只有一个线程可以访问这些资源。在操作资源后,线程会释放锁并唤醒等待的线程,以确保系统的并发性和正确性。

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

发表评论

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

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

相关阅读