JAVA多线程-类锁(多个对象同一把锁)

如果要使这个类的所有对象都共享一个方法的锁,那么需要将方法设置为static,再加上synchronized锁,这把锁属于类了,所有这个类的对象都共享这把锁。

继续之前的账户类,我们修改下代码

账户类:

package com.ck.thread;

import java.math.BigDecimal;

public class Account {

    public static synchronized void add(BigDecimal amount , String name) {

        System.out.println(name + ", 开始充值,充值前余额: " + amount);

        try {

            Thread.sleep(2000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println(name + ", 结束充值,充值后余额: " + amount);

    }   

}

同样充值的类也修改下:

package com.ck.thread;



import java.math.BigDecimal;



public class CzThread extends Thread{



    private Account account;



    private String accountName;

   

    public CzThread(Account account) {

        this.account = account;

    }
   

    @Override

    public void run() {

        account.add(new BigDecimal("100"), accountName);

    }


    public Account getAccount() {

        return account;

    }


    public void setAccount(Account account) {

        this.account = account;

    }


    public String getAccountName() {

        return accountName;

    }


    public void setAccountName(String accountName) {

        this.accountName = accountName;

    }

}

然后主线程来测试:

package com.ck.thread;


public class MainThread {


    public static void main(String[] args) throws InterruptedException {

        /**

         * 分别建两个账户,张三和李四

         *

         */

        Account account1 = new Account();

        Account account2 = new Account();

       

        CzThread t1 = new CzThread(account1);

        t1.setAccountName("张三");

        t1.start();

        CzThread t2 = new CzThread(account2);

        t2.setAccountName("李四");

        t2.start();

    }


}

运行结果:

张三, 开始充值,充值前余额: 100

张三, 结束充值,充值后余额: 100

李四, 开始充值,充值前余额: 100

李四, 结束充值,充值后余额: 100

 

我们看到李四是等待张三充值完了才能进去充值,其实这种充值方法在现实中如果是这样的话系统早就被投诉了,我们只是测试演示下,为了让大家更好的理解类级别的锁,就是在所要同步的方法加上static关键字,那么这个锁就属于这个类了,也就是作用于这个类的所有对象。

猜你喜欢

转载自blog.csdn.net/cgsyck/article/details/105986284