1. 程式人生 > 實用技巧 >同步鎖

同步鎖

執行緒同步

  1. 多個執行緒訪問同一個物件叫併發。

  2. 執行緒同步就是:排隊

  1. 佇列和 鎖 解決執行緒的安全性問題

  2. synchronized,當一個執行緒獲得物件的排它鎖,獨佔資源,其他執行緒必須等待,使用夠釋放鎖即可。

  3. 程式碼塊鎖可以鎖任何地方。

    package Thread;

    public class UnsafyBuyTickets {
    public static void main(String[] args) {
    BuyTicket buyTicket = new BuyTicket();
    new Thread(buyTicket,"明").start();
    new Thread(buyTicket,"剛").start();
    new Thread(buyTicket,"老闆").start();

    }
    }
    class BuyTicket implements Runnable{
    private int tickets = 10;
    boolean falg = true;
    @Override
    public void run() {
    //買票
    while(falg){
    buy();
    }

    }
    private synchronized void buy(){
    //判斷是否有票
    if (tickets<=0){
    falg = false;
    return;
    }
    //模擬程式碼延時
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+"拿到"+tickets--+"張票");
    }
    }
    package Thread;

    public class UnsafyBank {
    public static void main(String[] args) {
    Account account = new Account(2000000,"彩禮");
    Drawing you = new Drawing(account,1000000,"自己");
    Drawing wife = new Drawing(account,2000000,"妻子");
    you.start();
    wife.start();
    }
    }
    class Account {
    int money;
    String name;
    public Account(int money,String name){
    this.money = money;
    this.name = name;
    }
    }
    //模擬:銀行取款
    class Drawing extends Thread{
    Account account;//賬戶
    int drawingMoney;//取了多少錢
    String name;
    //現在手裡有多少錢
    int nowMoney;
    public Drawing(Account account,int drawingMoney,String name){
    super(name);
    this.account = account;
    this.drawingMoney = drawingMoney;

    this.nowMoney = nowMoney;
    }

    @Override
    public void run() {
    //鎖的對物件是變化的量,需要增刪改操作的量。
    synchronized (account){
    if(account.money-drawingMoney<0){
    System.out.println(Thread.currentThread().getName()+"錢不夠,取不了");
    return;
    }

    //模擬延時
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    account.money = account.money-drawingMoney;
    nowMoney = nowMoney+drawingMoney;
    System.out.println(account.name+"餘額為"+account.money);
    System.out.println(this.getName()+"手裡的錢:"+nowMoney);
    }
    }
    }
    package Thread;

    import java.util.ArrayList;
    import java.util.List;

    public class UnSafyList {
    public static void main(String[] args) {
    List<String> list = new ArrayList<String>();

    for (int i = 0; i < 10000; i++) {

    new Thread(() -> {
    synchronized (list) {
    list.add(Thread.currentThread().getName());
    }
    }).start();

    }
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(list.size());
    }

    }