zoukankan      html  css  js  c++  java
  • 线程同步

    方法一,同步代码块。方法二,同步方法。方法三,同步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();
    		}
    	}
    }
    
  • 相关阅读:
    [Todo]很不错的Java面试题类型整理,要看
    [Todo] Java并发编程学习
    自建一个Java Spring MVC项目
    [Todo] 乐观悲观锁,自旋互斥锁等等
    [Todo] Redis里面队列的两种模式,以及抢红包在Redis中的实现
    hdu 4704 同余定理+普通快速幂
    [置顶] ubuntu 和 win7 远程登陆 + vnc登陆
    mysql之触发器
    Jsoup API解析HTML中input标签
    IOS UITableView单条刷新,数据不刷新解决方案
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5614730.html
Copyright © 2011-2022 走看看