读书人

线程同步(2)synchronized

发布时间: 2012-12-21 12:03:49 作者: rapoo

线程同步(二)—synchronized


public class Account{private String accountNo;private double balance;public Account(){}public Account(String accountNo , double balance){this.accountNo = accountNo;this.balance = balance;}public void setAccountNo(String accountNo){this.accountNo = accountNo;}public String getAccountNo(){ return this.accountNo;}public double getBalance(){ return this.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("\t余额为: " + balance);}else{System.out.println(Thread.currentThread().getName() +"取钱失败!余额不足!");}}public int hashCode(){return accountNo.hashCode();}public boolean equals(Object obj){if (obj != null && obj.getClass() == Account.class){Account target = (Account)obj;return target.getAccountNo().equals(accountNo);}return false;}}?

package thread.account;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(){account.draw(drawAmount);}}

package thread.account;public class TestDraw{ public static void main(String[] args) {//创建一个账户Account acct = new Account("1234567" , 1000);//模拟两个线程对同一个账户取钱new DrawThread("甲" , acct , 800).start();new DrawThread("乙" , acct , 800).start(); }}

那么synchronized是如何释放资源的呢?答:所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,计数变为1。每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。


注:在jdk1.5之后,java提供了Lock进行同步处理,Lock能实现synchronized的所有功能,而且性能比synchronized高,我接下来继续讲Lock?



?

读书人网 >编程

热点推荐