多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理” 。本文简单记录一些关于线程、多线程的问题。本文记录了关于一些常见多线程业务问题处理。
多线程问题 1
问题:100个线程并发向1个银行账户中存入1元钱,并在全部完成后,打印银行账户的金额。
思路:创建100个线程(线程池);保证线程安全,同一时刻只有一个线程对账户进行操作(Lock 或者 synchronized)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
   |  public class Account {     private double balance;          public double getBalance() {         return this.balance;     }          public synchronized void deposit(double money) {         double newBalance = this.balance + money;         this.balance = newBalance;     } }
 
  public class Account2 {     private Lock reentrantLock = new ReentrantLock();     private double balance;          public double getBalance() {         return this.balance;     }          public void deposit(double money) {         reentrantLock.lock;         double newBalance = 0;         try {             newBalance = balance + money;             balance = newBalance;         } catch(Exception e){             e.printStackTrace();         } finally{           reentrantLock.unlock();           }         this.balance = newBalance;     } }
 
  public class TheadSaveAccount implements Runnable {     private Account account;     private double money;
      public TheadSaveAccount(Account account, double money) {         this.account = account;         this.money = money;     }
      @Override     public void run() {                  synchronized (account) {             account.deposit(money);         }     } }
 
  public class TheadSave {     public static void main (String[] args) {         ExecutorService service = Executors.newFixedThreadPool(100);         Account account = new Account();         for (int i = 0; i < 100; i++) {             service.execute( new TheadSaveAccount(account, 1) );         }         service.shutdown();         if (service.isTerminated()) {             System.out.println(account.getBalance());         }     } }
 
  |