线程同步

方法一,同步代码块。方法二,同步方法。方法三,同步lock

同步代码块,synchronized在线程的run方法里。同步监视器是Account类。

class Account {
	private String accountNo;
	private double balance;
	public Account(){}
	
	public Account(String accountNo, double balance)
	{
		this.accountNo = accountNo;
		this.setBalance(balance);
	}
	
	public void setAccountNo(String accountNO)
	{
		this.accountNo = accountNO;
	}
	public String getAccountNo()
	{
		return this.accountNo;
	}

	public double getBalance() {
		return balance;
	}

	public void setBalance(double balance) {
		this.balance = balance;
	}
	
}

public class DrawThread extends Thread {
	private Account account;
	private double drawAmount;
	public DrawThread(String name, Account account, double drawAmount)
	{
		super(name);
		this.account = account;
		this.drawAmount = drawAmount;
	}
	public void run()
	{
		//同步代码块
		synchronized(account)
		{
			if(account.getBalance() >= drawAmount)
			{
				System.out.println(getName()+"取钱成功!吐出钞票:"+drawAmount);
				try
				{
					Thread.sleep(1);
				}
				catch(InterruptedException ex)
				{
					ex.printStackTrace();
				}
				account.setBalance(account.getBalance() - drawAmount);
				System.out.println("余额为:"+ account.getBalance());
			}
			else
			{
				System.out.println(getName()+ "取钱失败!余额不足!");
			}
		}
	}
}

 同步方法,synchronized在主类里。同步监视器是调用这个方法的类,即this

public class Account2 {
	private String accountNo;
	private double balance;
	public Account2(){}
	public Account2(String accountNo, double balance)
	{
		this.setAccountNo(accountNo);
		this.setBalance(balance);
	}
	public String getAccountNo() {
		return accountNo;
	}
	public void setAccountNo(String accountNo) {
		this.accountNo = accountNo;
	}
	public double getBalance() {
		return balance;
	}
	public void setBalance(double balance) {
		this.balance = balance;
	}
	
	//同步方法
	public synchronized void draw(double drawAmount)
	{
		if(balance >= drawAmount)
		{
			System.out.println(Thread.currentThread().getName()+"取钱成功!吐出钞票:"+drawAmount);
			try
			{
				Thread.sleep(1);
			}
			catch(InterruptedException ex)
			{
				ex.printStackTrace();
			}
			balance -= drawAmount;
			System.out.println("余额为:"+balance);
		}
		else
		{
			System.out.println(Thread.currentThread().getName()+"取钱失败!余额不足!");
		}
	}
}

 同步锁使用Lock对象作为同步监视器,在finally里解锁

import java.util.concurrent.locks.ReentrantLock;
//同步锁lock
public class Account3 {
	private final ReentrantLock lock = new ReentrantLock();
	private String accountNo;
	private double balance;
	public Account3(){}
	
	public Account3(String accounNo, double balance)
	{
		this.setAccountNo(accountNo);
		this.setBalance(balance);
	}

	public String getAccountNo() {
		return accountNo;
	}

	public void setAccountNo(String accountNo) {
		this.accountNo = accountNo;
	}

	public double getBalance() {
		return balance;
	}

	public void setBalance(double balance) {
		this.balance = balance;
	}
	
	
	public void draw(double drawAmount)
	{
		lock.lock();
		try
		{
			if(balance >= drawAmount)
			{
				System.out.println(Thread.currentThread().getName()+"取钱成功!吐出钞票:"+drawAmount);
				try
				{
					Thread.sleep(1);
				}
				catch(InterruptedException ex)
				{
					ex.printStackTrace();
				}
				balance -= drawAmount;
				System.out.println("余额为:"+balance);
			}
			else
			{
				System.out.println(Thread.currentThread().getName()+"取钱失败!余额不足!");
			}
		}
		finally
		{
			lock.unlock();
		}
	}
}
原文地址:https://www.cnblogs.com/masterlibin/p/5614730.html