并发控制难题:多线程场景下的锁竞争实例

原创 梦里梦外; 2024-12-01 20:21 78阅读 0赞

在多线程编程中,锁竞争(Lock Contention)是一个常见的并发控制难题。以下是一个简单的实例来说明这个问题:

  1. // 线程1
  2. public class Thread1 extends Thread {
  3. private Object lock = new Object();
  4. @Override
  5. public void run() {
  6. synchronized (lock) {
  7. // 执行一些操作,可能会需要加锁
  8. for (int i = 0; i < 10_000; i++) {
  9. // 假设这里有一个耗时的操作
  10. Thread.yield(); // 模拟耗时操作
  11. }
  12. // 在任务完成后解锁
  13. lock.notifyAll();
  14. }
  15. }
  16. }
  17. // 线程2
  18. public class Thread2 extends Thread {
  19. private Object lock = new Object();
  20. @Override
  21. public void run() {
  22. synchronized (lock) {
  23. // 直接尝试获取锁,可能会遇到竞争
  24. lock.lock();
  25. try {
  26. // 这里假设这是一个需要加锁的操作
  27. for (int i = 0; i < 1_000; i++) {
  28. Thread.yield(); // 模拟耗时操作
  29. }
  30. // 在任务完成后解锁
  31. lock.unlock();
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. } finally {
  35. // 不论是否发生异常,最后都应该释放锁
  36. lock.notifyAll();
  37. }
  38. }
  39. }
  40. }
  41. public class Main {
  42. public static void main(String[] args) {
  43. Thread1 thread1 = new Thread1();
  44. Thread2 thread2 = new Thread2();
  45. thread1.start(); // 启动线程1
  46. thread2.start(); // 同理启动线程2
  47. // 等待所有线程完成
  48. try {
  49. thread1.join();
  50. thread2.join();
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }

在这个例子中,Thread1Thread2 同时尝试获取一个共享的锁。如果一个线程成功获得了锁,那么其他线程将无法获得相同的锁,从而产生锁竞争问题。

解决这种问题的方法包括使用互斥锁(Mutex)、条件变量(Condition Variable)等机制进行同步控制。

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

发表评论

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

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

相关阅读