读书人

java Thread编程(3) 同步的两种不同实

发布时间: 2013-09-06 10:17:17 作者: rapoo

java Thread编程(三) 同步的两种不同实现方式

1,创建需要同步的对象(方式一)

package concurrency;public class Bank {        private double amount;        public Bank(double amount){        this.amount = amount;    }        public double getAmount() {        return amount;    }        public void setAmount(double amount) {        this.amount = amount;    }        public synchronized void addAmount(double money){        System.out.println("当前金额为: "+amount);        amount = amount + money;        System.out.println("增加"+money+"后的金额为:"+amount);    }        public synchronized void substract(double money){        System.out.println("当前金额为: "+amount);        amount = amount - money;        System.out.println("减少"+money+"后的金额为:"+amount);    }}

2,创建两个线程对象

package concurrency;public class AddMoneyThread implements Runnable{    private Bank bank;    private double money;        public AddMoneyThread(Bank bank,double money){        this.bank = bank;        this.money = money;    }        /**      * @see java.lang.Runnable#run()     */    @Override    public void run() {        for(int i=0;i<10;i++){            bank.addAmount(money);        }    }}
package concurrency;public class SubstractMoneyThread implements Runnable{    private Bank bank;    private double money;        public SubstractMoneyThread(Bank bank,double money){        this.bank = bank;        this.money = money;    }        /**      * @see java.lang.Runnable#run()     */    @Override    public void run() {        for(int i=0;i<10;i++){            bank.substract(money);        }    }}


3,创建测试类

package concurrency;public class ConcurrencyTest {    public static void main(String[] args) {        Bank bank = new Bank(1000);        AddMoneyThread addThread = new AddMoneyThread(bank, 10);        SubstractMoneyThread subThread = new SubstractMoneyThread(bank, 10);                Thread addT = new Thread(addThread);        Thread subT = new Thread(subThread);        addT.start();        subT.start();    }}

4,创建需要同步的对象(方式二)

package concurrency;public class Bank {        private double amount;        public Bank(double amount){        this.amount = amount;    }        public double getAmount() {        return amount;    }        public void setAmount(double amount) {        this.amount = amount;    }        public void addAmount(double money){        synchronized(this){            System.out.println("当前金额为: "+amount);            amount = amount + money;            System.out.println("增加"+money+"后的金额为:"+amount);        }    }        public void substract(double money){        synchronized(this){            System.out.println("当前金额为: "+amount);            amount = amount - money;            System.out.println("减少"+money+"后的金额为:"+amount);        }    }}

1,synchronized作为一种同步手段,解决java多线程的执行有序性和内 存可见性

2,一个线程执行临界区代码过程如下:
(1) 获得同步锁
(2)清空工作内存
(3) 从主存拷贝变量副本到工作内存
(4) 对这些变量计算
(5) 将变量从工作内存写回到主存
(6) 释放锁

有几个问题不是很清楚。

我给方法上或者同步对象上加了锁,但是发现synchronized所包围的块是一个原子操作?不知道是什么原因?

个人的理解是:同步对象被加了锁,同步对象只能被一个线程访问。

该对象中的方法也只能被一个线程访问????

求指点!





读书人网 >编程

热点推荐