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

原创 忘是亡心i 2024-09-15 04:48 196阅读 0赞

在Java中,多线程同步主要通过以下几种方式来实现:

  1. synchronized关键字:用于修饰方法或代码块,保证同一时刻只有一个线程进入该区域。
  1. // 以对象为例
  2. object synchronizedMethod() {
  3. // 方法体
  4. }
  5. class MyClass {
  6. private Object lock = new Object();
  7. synchronized void criticalSection() {
  8. lock synchronized () {
  9. // 方法体
  10. }
  11. }
  12. }
  1. wait/notify:用于线程间通信,通过调用wait()notify()方法来控制线程状态。
  1. class LockObject {
  2. private boolean locked = false;
  3. private Object lock = new Object();
  4. public synchronized void lock() {
  5. if (locked) throw new IllegalStateException("Cannot relock");
  6. locked = true;
  7. try {
  8. lock synchronized () {
  9. // 等待其他线程释放锁,或者超时
  10. while (!lock.lock()) {
  11. try {
  12. wait();
  13. } catch (InterruptedException e) {
  14. Thread.currentThread().interrupt();
  15. e.printStackTrace();
  16. }
  17. }
  18. // 处理业务逻辑
  19. } finally {
  20. locked = false;
  21. notifyAll(); // 唤醒所有等待的线程
  22. }
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. locked = false; // 无论什么原因,尝试重新解锁
  26. }
  27. }
  28. public synchronized void unlock() {
  29. if (!locked) throw new IllegalStateException("Lock is not held");
  30. lock.unlock(); // 解锁
  31. locked = false;
  32. notifyAll();
  33. }
  34. }
  1. 原子类和方法:Java 1.5引入了Atomic类,它们提供了无共享的内存访问。此外,还可以使用sun.misc.Unsafe进行原子操作。
  1. import java.util.concurrent.atomic.AtomicInteger;
  2. public class AtomExample {
  3. private AtomicInteger count = new AtomicInteger(0);
  4. public void increment() {
  5. count.incrementAndGet();
  6. }
  7. public int decrementIfZero() {
  8. if (count.decrementIfZero(0)) return 1;
  9. return 0; // 如果count变为0,说明已经减为0了
  10. }
  11. }

以上实例展示了Java多线程同步的一些常见方法。在实际应用中,可能需要根据具体需求选择合适的方法。

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

发表评论

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

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

相关阅读