Synchronized(对象锁)

银行取钱问题

过去人们取钱可以使用存折和银行卡,那么问题来了,如果两个人分别拿着同一个账户的银行卡和存折,分别去取钱,这样就会出现问题,取出的钱会是已有存款的两倍,这就给银行带来了很大的危害,针对这一现象,最好的解决办法就是一个人取钱的同事,如果是同一账户,另外一个人是无法进行银行取款业务的,于是,synchronized 就加入进来了。

模拟银行取款程序

  • 首先给定一个账户(账户名,账户存款)
  • 再给定取款业务逻辑(账户,取款现金)
  • 采用多线程实现取钱业务

1. 账户的创建

package com.bankserver;

public class Account {
	private int id;
	private double money;
	public Account() {
	}
	public Account(int id, double money) {
		super();
		this.id = id;
		this.money = money;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
}

2. 账户管理的创建

package com.bankserver;
public class AccountManage {
	private Account account;
	public AccountManage(Account account) {
		super();
		this.account = account;
	}
	public void getMoney(double cash){
		//判断存款是否够取
		if(account.getMoney()>=cash){
			double d=account.getMoney()-cash;
			System.out.println("取款:"+cash+"元"+"剩余:"+d+"元");
			account.setMoney(d);
		}else{
			System.out.println("余额不足,取款失败!");
		}
	}
}

3. 取钱测试

package com.bankserver;
//TestAccount成为线程
public class TestAccount extends Thread{
	private AccountManage am;
	private double cash;
	//创建线程构造器
	public TestAccount(AccountManage am, double cash) {
		super();
		this.am = am;
		this.cash = cash;
	}
	//重写run方法
	@Override
	public void run() {
		//锁住操作对象,避免线程不同步
			synchronized (am) {
			am.getMoney(cash);
			}
	}
	public static void main(String[] args) {
		//创建账户对象
		Account a=new Account(1,35000);
		//创建管理对象
		AccountManage am=new AccountManage(a);
		//创建线程对象ta1
		TestAccount ta1=new TestAccount(am,30000);
		//为线程ta1设置最大优先权,这样保证该线程第一执行
		ta1.setPriority(MAX_PRIORITY);
		//创建线程对象ta2
		TestAccount ta2=new TestAccount(am,5000);
		//创建线程对象ta3
		TestAccount ta3=new TestAccount(am,100);
		//为线程ta3设置最小优先权,保证该线程最后执行
		ta3.setPriority(MIN_PRIORITY);
		ta1.start();
		ta2.start();
		ta3.start();
	}
}

Synchronized(对象锁)_第1张图片

小结

Synchronized(对象锁)的使用很简单,只需将对象或者方法锁定即可,利用好Synchronized(对象锁)可以解决很多线程不同步带来的不便。

你可能感兴趣的:(JAVA)