从源代码分析Java多线程同步问题

原创 港控/mmm° 2024-09-11 11:24 127阅读 0赞

在Java中,多线程同步是确保多个线程访问共享资源时不会产生冲突的关键技术。以下是一些常见的同步问题及其源代码分析:

  1. 竞态条件:多个线程同时访问和修改同一个数据结构。

    1. // 示例 - 竞态条件
    2. class SharedCounter {
    3. int count = 0;
    4. synchronized void increment() {
    5. count++;
    6. }
    7. synchronized int getCount() {
    8. return count;
    9. }
    10. }
  2. 死锁:两个或更多的线程彼此等待对方释放资源,从而导致它们都无法继续执行。

    1. // 示例 - 死锁
    2. class BankAccount {
    3. private Account account;
    4. class Account {
    5. private String name;
    6. private int balance;
    7. synchronized void deposit(int amount) {
    8. balance += amount;
    9. System.out.println("Deposit: " + amount);
    10. }
    11. synchronized void withdraw(int amount) {
    12. if (amount > balance) {
    13. throw new IllegalArgumentException("Withdrawal exceeds available balance.");
    14. }
    15. balance -= amount;
    16. System.out.println("Withdrawal: " + amount);
    17. }
    18. }
    19. public BankAccount(String name) {
    20. account = new Account(name, 0));
    21. }
    22. synchronized void deposit(int amount) {
    23. account.deposit(amount);
    24. }
    25. synchronized void withdraw(int amount) {
    26. account.withdraw(amount);
    27. }
    28. // 示例 - 死锁
    29. public static void main(String[] args) {
    30. BankAccount account1 = new BankAccount("Account1");
    31. BankAccount account2 = new BankAccount("Account2");
    32. // 创建线程并尝试操作账户
    33. Thread thread1 = new Thread(() -> account1.deposit(50)));
    34. Thread thread2 = new Thread(() -> account2.withdraw(30)));
    35. // 启动线程
    36. thread1.start();
    37. thread2.start();
    38. // 这会导致死锁,因为每个线程都在等待对方释放资源。
    39. try {
    40. thread1.join();
    41. thread2.join();
    42. } catch (InterruptedException e) {
    43. e.printStackTrace();
    44. }
    45. }
    46. }

要解决这些问题,需要采用适当的同步机制,如互斥锁(Mutex)、条件变量(Condition)、读写锁(ReentrantReadWriteLock)等。

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

发表评论

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

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

相关阅读

    相关 Java线同步问题分析

    Java多线程同步是指在多个线程同时访问和修改共享资源时,为了避免数据竞争和状态不一致的问题,需要使用一些同步工具。 以下是Java多线程同步问题的一些常见情况及分析: 1