Java多线程并发执行问题实例

原创 缺乏、安全感 2024-09-20 23:15 128阅读 0赞

在Java多线程并发执行中,常见的问题实例包括:

  1. 数据竞争:多个线程同时访问和修改共享的数据,可能会导致结果不一致。
  1. // 示例:两个线程同时修改count
  2. public class Counter {
  3. private int count = 0;
  4. public synchronized void increment() {
  5. count++;
  6. }
  7. public synchronized int getCount() {
  8. return count;
  9. }
  10. }
  1. 死锁:当两个或更多线程因争夺资源而造成的一种互相等待的现象被称为死锁。
  1. // 示例:死锁产生
  2. public class Banker {
  3. private Account[] accounts;
  4. public Banker(int numAccounts) {
  5. accounts = new Account[numAccounts];
  6. }
  7. public synchronized void deposit(Account account, double amount) {
  8. if (account.balance + amount > 0 && !contains(account)) {
  9. account.balance += amount;
  10. } else {
  11. System.out.println("Insufficient funds or duplicate account.");
  12. }
  13. }
  14. public synchronized void withdraw(Account account, double amount) {
  15. if (amount <= account.balance) {
  16. if (!contains(account)) {
  17. account.balance -= amount;
  18. } else {
  19. System.out.println("Duplicate account. Unable to withdraw.");
  20. }
  21. } else {
  22. System.out.println("Insufficient funds for withdrawal.");
  23. }
  24. }
  25. private boolean contains(Account account) {
  26. for (Account other : accounts) {
  27. if (other == account || other.balance == account.balance) {
  28. return true;
  29. }
  30. }
  31. return false;
  32. }
  33. }
  1. 线程饥饿:当某些线程没有足够的资源(如CPU时间)来执行时,就会出现这种现象。
  1. // 示例:线程饥饿问题
  2. public class StarvationExample {
  3. private int[] resources = new int[10];
  4. public synchronized void acquireResource() {
  5. while (resources[0] < 1) { // 线程饿死在这里
  6. try {
  7. wait();
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. resources[0]--;
  13. notifyAll(); // 通知所有等待的线程资源已释放
  14. }
  15. }

以上这些例子都是Java多线程并发执行中可能出现的问题。在实际编程时,需要充分理解并采取适当措施来避免这些问题。

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

发表评论

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

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

相关阅读

    相关 Java 线并发问题实例

    在Java多线程环境中,常见的并发问题包括死锁、活锁、饥饿现象、资源泄露等。以下是一个简单的例子来说明这些问题: 1. 死锁: ```java // 线程A public c