实例理解Java多线程并发问题

原创 太过爱你忘了你带给我的痛 2024-12-03 14:57 146阅读 0赞

在Java中,多线程并发问题是编程中的常见挑战。下面是一个简单理解和实例解析Java多线程并发问题的例子:

  1. 线程同步:这是最常见的并发问题。例如,在一个银行账户类中,如果两个线程同时修改存款金额,可能会导致数据不一致。
  1. // 线程同步示例(使用synchronized关键字)
  2. class BankAccount {
  3. private double balance;
  4. public synchronized void deposit(double amount) {
  5. balance += amount;
  6. notifyAll(); // 唤醒等待的线程
  7. }
  8. public synchronized void withdraw(double amount) {
  9. if (amount > balance) {
  10. throw new IllegalArgumentException("Insufficient balance");
  11. }
  12. balance -= amount;
  13. notifyAll(); // 唤醒等待的线程
  14. }
  15. // 省略其他方法和构造器
  16. }
  1. 死锁:当两个或更多的线程在执行过程中,因争夺资源而造成的一种互相等待的现象称为死锁。
  1. // 死锁示例(使用两个互斥的资源)
  2. class DeadlockExample {
  3. private Object resource1 = new Object();
  4. private Object resource2 = new Object();
  5. // 两个互斥的线程方法
  6. public void threadA() {
  7. while (true) { // 创建无限循环来模拟等待资源
  8. synchronized (resource2) { // 确保资源2在任何时候都只被一个线程访问
  9. if (resource2.equals(resource2)) { // 如果资源2可用,获取并释放资源
  10. resource2 = new Object();
  11. System.out.println("Thread A acquired resource 2");
  12. break;
  13. }
  14. }
  15. }
  16. }
  17. public void threadB() {
  18. while (true) { // 创建无限循环来模拟等待资源
  19. synchronized (resource1) { // 确保资源1在任何时候都只被一个线程访问
  20. if (resource1.equals(resource1)) { // 如果资源1可用,获取并释放资源
  21. resource1 = new Object();
  22. System.out.println("Thread B acquired resource 1");
  23. break;
  24. }
  25. }
  26. }
  27. }
  28. public static void main(String[] args) {
  29. DeadlockExample example = new DeadlockExample();
  30. Thread threadA = new Thread(example::threadA));
  31. Thread threadB = new Thread(example::threadB));
  32. threadA.start();
  33. threadB.start();
  34. try {
  35. threadA.join(); // 等待线程A结束
  36. threadB.join(); // 等待线程B结束
  37. } catch (InterruptedException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

以上例子展示了Java中常见的死锁问题,以及如何通过synchronized关键字来避免死锁。

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

发表评论

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

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

相关阅读