1.加鎖方式:
1-1.使用synchronized關鍵字進行方法或代碼塊的加鎖方式
1-2.使用ReentrantLock類提供的lock()方法的方式
2.代碼實現(傳統的銀行取款存款問題):
2-1.Account.java類:賬戶類

package com.java.thread; import java.util.concurrent.locks.ReentrantLock; /** * 賬戶類 * @author steven * */ public class Account { public double money = 6000; public ReentrantLock lock = new ReentrantLock(); public Account(double money){ this.money = money; } public void drawmoney(double money,String name){ synchronized (this) { this.money -= money; System.out.println(name+"取款后剩余錢數:"+this.money); } } public void drawmoney1(double money,String name){ lock.lock(); try { this.money -= money; System.out.println(name+"取款后剩余錢數:"+this.money); }catch (Exception e) { // TODO: handle exception }finally{ lock.unlock(); } } public synchronized void cunmony(double money,String name){ this.money += money; System.out.println(name+"存款后剩余錢數:"+this.money); } }
2-2.User.java類:線程實現類

package com.java.thread; /** * 繼承線程類,重寫run方法 * @author steven * */ public class User extends Thread{ private String username; private Account account; public User(String username,Account account){ this.username = username; this.account = account; } public void run(){ if (username.contains("0")||username.contains("1")||username.contains("2")) this.account.cunmony(1000,username); else if(username.contains("3")) this.account.drawmoney(500, username); else this.account.drawmoney1(100, username); } public static void main(String[] args) { Account account = new Account(10000); User user = null; for (int i = 0; i < 5; i++) { user = new User("user"+i, account); user.setPriority(i+1); user.start(); } } }
3.誤區總結:
賬戶在這一問題中就算是多線程問題中的共享資源,在線程實現類中,我們需要使用構造函數的方式將該資源定義到該類的構造函數里,在具體多線程操作時創建唯一的資源,並將其放入新建線程的構造函數中,這樣就能實現模擬多個線程操作同一資源的效果。