關於java多線程任務執行時共享資源加鎖的方式思考


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);
    }
    
}
View Code

  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();
        }
    }
}
View Code

3.誤區總結:

  賬戶在這一問題中就算是多線程問題中的共享資源,在線程實現類中,我們需要使用構造函數的方式將該資源定義到該類的構造函數里,在具體多線程操作時創建唯一的資源,並將其放入新建線程的構造函數中,這樣就能實現模擬多個線程操作同一資源的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM