Java并发学习之十一——同步方法
2014-09-15 16:38
405 查看
本文是学习网络上的文章时的总结,感谢大家无私的分享。
每个方法声明为synchronized关键字是一个临界区,Java只允许一个对象执行其中的一个临界区。
静态方法有不同的行为。只有一个执行线程访问被synchronized关键字声明的静态方法,但另一个线程可以访问该类的一个对象中的其他非静态的方法。 你必须非常小心这一点,因为两个线程可以访问两个不同的同步方法,如果其中一个是静态的而另一个不是。如果这两种方法改变相同的数据,你将会有数据不一致
的错误。
每个方法声明为synchronized关键字是一个临界区,Java只允许一个对象执行其中的一个临界区。
静态方法有不同的行为。只有一个执行线程访问被synchronized关键字声明的静态方法,但另一个线程可以访问该类的一个对象中的其他非静态的方法。 你必须非常小心这一点,因为两个线程可以访问两个不同的同步方法,如果其中一个是静态的而另一个不是。如果这两种方法改变相同的数据,你将会有数据不一致
的错误。
package chapter2; 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 tmp = balance; try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } tmp+=amount; balance = tmp; } public synchronized void subtractAmount(double amount){ double tmp = balance; try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } tmp-=amount; balance=tmp; } }
package chapter2; public class Bank implements Runnable{ private Account account; public Bank(Account account) { this.account = account; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<100;i++){ account.subtractAmount(1000); } } }
package chapter2; public class Company implements Runnable{ private Account account; public Company(Account account) { this.account = account; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<100;i++){ account.addAmount(1000); } } }
package chapter2; public class Main { /** * <p> * </p> * @author zhangjunshuai * @date 2014-9-11 下午4:49:50 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub 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:Initial balance:%f\n", account.getBalance()); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
相关文章推荐
- Java并发读书学习笔记(十一)——原子变量与非阻塞同步机制
- Java并发学习笔记(9)组合对象的安全同步
- Java多线程学习笔记—从Map开始说说同步和并发
- 并发编程实战学习笔记(十一)-原子变量与非阻塞同步机制
- Java并发学习(十)-CAS中ABA问题解决方法
- java并发编程学习7--同步--ReentrantLock
- Java并发学习笔记(7)线程的同步 (锁)
- java基础知识回顾之java Thread类学习(十一)--join方法的理解
- [置顶] java Thread Join方法学习(同步)
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
- Java并发学习之线程状态及Thread常用方法详解
- Java并发学习之十三——在同步代码中使用条件
- Android(java)学习笔记68:同步代码块的锁和同步方法的应用
- Java并发学习之十五——使用读写锁同步数据訪问
- java线程学习5——线程同步之同步方法
- Java并发学习之十五——使用读写锁同步数据访问
- java并发编程学习之currentThread方法学习
- java并发编程学习之interrupt相关方法学习(一)
- 【Java并发学习】之线程的同步
- Java多线程与并发学习之(四):线程常用方法