并发挑战:Java线程同步和竞态条件示例

原创 ゝ一纸荒年。 2024-11-29 23:36 134阅读 0赞

在Java编程中,线程同步和竞态条件是常见的并发挑战。以下是一些具体的示例:

  1. 共享资源问题

    • 互斥锁(Synchronized)

      1. public class Counter {
      2. private int count = 0;
      3. private Object lock = new Object();
      4. // 同步方法,确保同一时间只有一个线程访问count属性
      5. synchronized (lock) {
      6. count++;
      7. System.out.println("Count increased by " + count);
      8. }
      9. }
    • 条件变量(Condition Variables)

      1. public class SleepyThread {
      2. private final Object lock = new Object();
      3. private final Condition cond = new Condition(lock);
      4. // 等待条件满足后才继续执行的代码块
      5. private void waitUntilCountIsGreaterThanZero() {
      6. try {
      7. cond.await();
      8. } catch (InterruptedException e) {
      9. e.printStackTrace();
      10. }
      11. }
      12. public void incrementCountAndSleep() {
      13. synchronized (lock) {
      14. if (count == 0) {
      15. cond.signalAll(); // 如果条件未满足,触发信号量操作
      16. }
      17. count++;
      18. System.out.println("Count increased by " + count);
      19. // 等待条件满足后才继续执行的代码块
      20. waitUntilCountIsGreaterThanZero();
      21. }
      22. }
      23. }
  2. 竞态条件

    • 多个线程同时访问共享资源

      1. public class Counter {
      2. private int count = 0;
      3. // 不同步方法,可能导致竞态条件
      4. public void incrementCount() {
      5. count++;
      6. System.out.println("Counter incremented by " + count);
      7. }
      8. }
    • 锁的不当使用

      1. public class CounterWithBadLocking {
      2. private int count = 0;
      3. // 锁的不当使用,可能导致线程安全问题
      4. public void incrementCount() {
      5. synchronized (CounterWithBadLocking.class)) { // 注意,错误地将类作为锁对象
      6. count++;
      7. System.out.println("Counter incremented by " + count);
      8. }
      9. }
      10. }

通过以上示例,可以看出在并发编程中,理解和正确使用线程同步机制(如互斥锁、条件变量等)以及避免竞态条件是至关重要的。

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

发表评论

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

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

相关阅读