Java多线程之~~~~synchronized 方法
2014-09-18 22:07
363 查看
在多线程开发中,总会遇到多个在不同线程中的方法操作同一个数据,这样在不同线程中操作这个数据不同的顺序
或者时机会导致各种不同的现象发生,以至于不能实现你预期的效果,不能实现一致性,这时候就可以使用
synchronized关键字对一个方法来说,这个synchronized能保证所有调用这个方法的线程只有一个正在操作这个方法,
不会出现同时多个线程进入这个方法的情况,下面我们来一个例子说明这个情况。
首先是一个Account类,这个类模拟账户,提供增加工资和减少工资的方法,当然,这个方法是被synchronized控制
和保护的。
然后是两个模拟类,来模拟使用这个类来增加或者减少账户的余额
这样无论怎么使用都能得到正确的结果
或者时机会导致各种不同的现象发生,以至于不能实现你预期的效果,不能实现一致性,这时候就可以使用
synchronized关键字对一个方法来说,这个synchronized能保证所有调用这个方法的线程只有一个正在操作这个方法,
不会出现同时多个线程进入这个方法的情况,下面我们来一个例子说明这个情况。
首先是一个Account类,这个类模拟账户,提供增加工资和减少工资的方法,当然,这个方法是被synchronized控制
package com.bird.concursey.charpet2; public class Account { private double balance; public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public synchronized void addAmount(double amount) { double temp = balance; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } temp += amount; balance = temp; } public synchronized void subtractAmount(double amount) { double temp = balance; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } temp -= amount; balance = temp; } }
和保护的。
然后是两个模拟类,来模拟使用这个类来增加或者减少账户的余额
package com.bird.concursey.charpet2; public class Bank implements Runnable { private Account account; public Bank(Account account) { this.account = account; } @Override public void run() { for(int i = 0; i < 100; i++) { account.subtractAmount(1000); } } }
package com.bird.concursey.charpet2; public class Company implements Runnable { private Account account; public Company(Account account) { this.account = account; } @Override public void run() { for(int i = 0; i < 100; i++) { account.addAmount(1000); } } public static void main(String[] args) { Account account = new Account(); account.setBalance(1000); Company company = new Company(account); Thread companyThread = new Thread(company); Bank bank = new Bank(account); Thread bankThread = new Thread(bank); System.out.printf("Account : Initial Balance: %f\n",account.getBalance()); companyThread.start(); bankThread.start(); try { companyThread.join(); bankThread.join(); System.out.printf("Account : Final Balance: %f\n",account.getBalance()); } catch (InterruptedException e) { e.printStackTrace(); } } }
这样无论怎么使用都能得到正确的结果
相关文章推荐
- 初学Java多线程:使用Synchronized关键字同步类方法
- (转)初学Java多线程:使用Synchronized关键字同步类方法
- 四、java多线程核心技术——synchronized同步方法与synchronized同步快
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- 初学Java多线程:使用Synchronized关键字同步类方法
- 【JAVA】多线程之synchronized 同步数据 方法
- java多线程------synchronized方法,块
- java多线程下synchronized修饰static方法与非static方法的区别
- java多线程----synchronized方法锁能否锁住对象呢?
- 九、初学Java多线程:使用Synchronized关键字同步类方法
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解
- java 多线程8 : synchronized锁机制 之 方法锁
- Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
- java多线程(四)synchronized关键字修饰方法
- JAVA多线程(五)用lock、synchronized、阻塞队列三种方法实现生产者消费者模式
- Java 多线程:synchronized 关键字用法(修饰类,方法,静态方法,代码块)
- java 多线程10:synchronized锁机制 之 锁定类静态方法 和锁定类.Class 和 数据String的常量池特性
- Java多线程之Synchronized应用在static和非static方法上的区别