如何在Java中实现同步:面试问题及解决方法

原创 阳光穿透心脏的1/2处 2025-03-23 06:36 14阅读 0赞

在Java中实现同步主要依赖于两个重要的特性:互斥性和条件变量。

  1. 互斥锁(Synchronized)
    这是最基础的同步机制。当一个线程进入synchronized代码块时,会获取到当前对象的锁,其他线程必须等到这个锁被释放才能执行。
  1. public class Counter {
  2. private int count;
  3. public synchronized void increment() {
  4. count++;
  5. }
  6. public synchronized int decrement() {
  7. if (count > 0) {
  8. count--;
  9. return count;
  10. } else {
  11. throw new IllegalArgumentException("Counter is already at zero!");
  12. }
  13. }
  14. // getter for count
  15. }
  1. 条件变量(Condition)
    当一个线程等待特定条件满足时,可以使用条件变量。通常与synchronized一起使用。
  1. public class SleepyThread {
  2. private final Condition condition;
  3. private boolean ready;
  4. public SleepyThread(Condition condition) {
  5. this.condition = condition;
  6. }
  7. // method to wait until ready
  8. public void awaitReady() throws InterruptedException {
  9. synchronized (condition) {
  10. while (!ready) {
  11. condition.await();
  12. }
  13. }
  14. }
  15. // method to signal when ready
  16. public void signalReady() {
  17. synchronized (condition) {
  18. ready = true;
  19. condition.signalAll(); // signal all waiting threads
  20. }
  21. }
  22. // usage example
  23. public static void main(String[] args) {
  24. Condition condition = new Condition();
  25. SleepyThread thread1 = new SleepyThread(condition);
  26. SleepyThread thread2 = new SleepyThread(condition);
  27. thread1.awaitReady();
  28. thread2.signalReady();
  29. thread1印状态("thread1 ready" + thread1的状态());
  30. thread2印状态("thread2 ready" + thread2的状态());
  31. // 按任意键退出
  32. System.in.read();
  33. }
  34. }

这里,Conditionjava.util.concurrent.locks.Condition的子类。awaitReady()方法会使得线程进入等待条件满足的状态,而signalReady()方法则用于通知线程条件已经满足。

在面试中,理解同步机制并能够运用到实际代码中是面试的重点之一。

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

发表评论

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

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

相关阅读