并发挑战:Java多线程环境下同步与互斥问题实例

原创 小咪咪 2024-12-11 02:00 111阅读 0赞

在Java多线程环境中,同步和互斥是两个常见的并发控制问题。

例子1:互斥锁(Synchronized)

  1. public class Counter {
  2. private int count = 0;
  3. public synchronized void increment() {
  4. count++;
  5. notifyAll(); // 唤醒所有等待的线程
  6. }
  7. public synchronized void decrement() {
  8. count--;
  9. if (count == 0) {
  10. notifyAll(); // 唤醒所有等待的线程
  11. }
  12. }
  13. public int getCount() {
  14. return count;
  15. }
  16. }

在这个例子中,incrementdecrement方法被声明为synchronized。这使得在同一时间只有一个线程能够访问这些方法,从而实现了互斥。

例子2:同步块(Synchronized Block)

  1. public class MutexExample {
  2. private Object lock = new Object();
  3. public void criticalSection() {
  4. synchronized (lock) { // 同步块
  5. // 这里是线程安全的代码
  6. }
  7. }
  8. public static void main(String[] args) {
  9. MutexExample example = new MutexExample();
  10. Thread thread1 = new Thread(() -> {
  11. example.criticalSection(); // 访问同步代码
  12. }));
  13. Thread thread2 = new Thread(() -> {
  14. example.criticalSection(); // 访问同步代码
  15. }));
  16. thread1.start();
  17. thread2.start();
  18. try {
  19. thread1.join();
  20. thread2.join();
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }

在这个例子中,criticalSection方法被设计为一个同步块。当多个线程同时访问这个同步块时,只有一个线程能够执行里面的代码,实现了互斥和同步。

这两种方式都是Java中用来解决并发问题的重要工具。

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

发表评论

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

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

相关阅读