• 线程同步


    方法一,同步代码块。方法二,同步方法。方法三,同步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();
    		}
    	}
    }
    
  • 相关阅读:
    SQL Server中出现用户或角色在当前数据库已经存在的问题的解决
    vs项目中添加lib库的方法总结
    【转载】C++ Socket通信总结(附C++实现)
    【转载】windows socket函数详解
    如何在 Debian 9 下安装 LEMP 和 WHMCS 7.5
    13个云计算基础设施自动化的最佳工具
    5分钟打造一个前端性能监控工具
    我的处女作——设计模式之状态模式
    IOS逆向分析笔记——replay逆向分析
    IOS逆向分析——GL脚本的提取
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5614730.html
Copyright © 2020-2023  润新知