Java 线程互斥
2013-11-28 11:39
260 查看
线程互斥就是用关键字synchronized 来对共享数据对象尽心锁定, 包括synchronized方法和 synchronized 块
看一个经典的银行例子代码:
每次运行结果不尽相同:
新开一个账户 : 罗同龙
罗同龙 存入100.0
剩余 :100.0
罗同龙想取出200.0, 但是余额不足, 实际 取出100.0
剩余 :0.0
罗同龙 存入300.0
剩余 :300.0
罗同龙 存入200.0
剩余 :500.0
看一个经典的银行例子代码:
import java.io.*; class hello //银行账户类, 名字不好听 { private String holdName; private double amount; public hello(String holdName){ this.holdName = holdName; this.amount = 0; System.out.println("新开一个账户 : " + this.holdName); } public synchronized void deposit(double amt){ //存款, 锁定这个方法 this.amount += amt; System.out.println(this.holdName + " 存入" + amt); } public synchronized void withdrow(double amt){ //取款, 锁定这个方法 if(amt > this.amount){ System.out.println(this.holdName + "想取出" + amt + ", 但是余额不足, 实际" + " 取出" + this.amount); amt = this.amount; this.amount -= amt; } else{ System.out.println(this.holdName + " 取出" + amt); this.amount -= amt; } } public synchronized double checkBalance(){ //查询, 锁定这个方法 return this.amount; } public static void main(String args[]) { hello h = new hello("罗同龙"); (new Save(h, 100)).start(); (new Save(h, 200)).start(); (new Save(h, 300)).start(); (new Fetch(h, 200.0)).start(); } } class Save extends Thread //存款的线程 { private hello a1; private double amount; public Save(hello a, double amt){ this.a1 = a; this.amount = amt; } public void run(){ synchronized (a1){ ///当或得对象A1的锁后就锁定这个代码块 double k = a1.checkBalance(); try{ sleep(1); }catch(InterruptedException e){ System.out.println(e); } a1.deposit(this.amount); System.out.println("剩余 :" + a1.checkBalance() ); } } } class Fetch extends Thread //取钱线程 { private hello a1; private double amount; public Fetch(hello a, double amt){ this.a1 = a; this.amount = amt; } public void run(){ synchronized (a1){ //当或得对象A1的锁后就锁定这个代码块 double k = a1.checkBalance(); try{ sleep(1); } catch(InterruptedException e){ System.out.println(e); } a1.withdrow(amount); System.out.println("剩余 :" + a1.checkBalance() ); } } }
每次运行结果不尽相同:
新开一个账户 : 罗同龙
罗同龙 存入100.0
剩余 :100.0
罗同龙想取出200.0, 但是余额不足, 实际 取出100.0
剩余 :0.0
罗同龙 存入300.0
剩余 :300.0
罗同龙 存入200.0
剩余 :500.0
相关文章推荐
- JAVA中线程互斥和同步
- java多线程之传统线程互斥技术
- java资源竞争问题(线程互斥)
- Java—传统线程互斥技术synchronized
- 三:java中传统线程互斥
- java线程深度解析(二)——线程互斥技术与线程间通信
- Java并发02---传统线程互斥技术——synchronized
- JAVA 并发编程-传统线程互斥技术(Synchronized)(三)
- Java多线程与并发应用-(2)-线程互斥synchronized
- java资源竞争问题(线程互斥)
- 【java并发】传统线程互斥技术—synchronized
- Java多线程编程--(3)线程互斥、同步的理解
- JAVA 并发编程-传统线程互斥技术(Synchronized)(三)
- 黑马程序员——Java多线程—线程互斥—synchronized
- java基础:线程互斥
- java多线程:3、线程互斥
- JAVA几个线程互斥排队输出结果
- java中的多线程——线程创建方式、线程互斥和线程间通信
- Java并发库(三):传统线程互斥技术
- Java线程(四):JUC包线程互斥与同步以及读写锁