同步与死锁的问题
2011-12-09 11:50
183 查看
比如一个卖票程序,如果多线程同时操作时,就有可能出现卖出票为负数的问题。
例子:用Runnable接口实现多线程,并产生3个线程对象。同时卖五张票
结果:
卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
卖票:ticket=0
卖票:ticket=-1
出现了-1,所以就引出同步代码块
【同步代码块】
synchronized(同步对象){需要同步的代码}
范例:
结果:
卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
这样就可以避免买票出现负数的问题!!!
还有一个方法是同步方法:
【同步方法】
synchronized 方法返回值 方法名称(参数列表){}
结果:
卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
例子:用Runnable接口实现多线程,并产生3个线程对象。同时卖五张票
package test2; class MyThread11 implements Runnable { private int ticket = 5; public void run() { for (int i = 0; i < 100; i++) { if (ticket > 0) { try { Thread.sleep(300); } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } System.out.println("卖票:ticket=" + ticket--); } } } } public class SyncDemo01 { public static void main(String[] args) { MyThread11 mt = new MyThread11(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }
结果:
卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
卖票:ticket=0
卖票:ticket=-1
出现了-1,所以就引出同步代码块
【同步代码块】
synchronized(同步对象){需要同步的代码}
范例:
package test2; class MyThread11 implements Runnable { private int ticket = 5; public void run() { for (int i = 0; i < 100; i++) { synchronized (this) { if (ticket > 0) { try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } System.out.println("卖票:ticket=" + ticket--); } } } } } public class SyncDemo01 { public static void main(String[] args) { MyThread11 mt = new MyThread11(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }
结果:
卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
这样就可以避免买票出现负数的问题!!!
还有一个方法是同步方法:
【同步方法】
synchronized 方法返回值 方法名称(参数列表){}
package test2; class MyThread11 implements Runnable { private int ticket = 5; public void run() { for (int i = 0; i < 100; i++) { this.sale1(); } } public synchronized void sale1() { if (ticket > 0) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("卖票:ticket=" + ticket--); } } } public class SyncDemo01 { public static void main(String[] args) { MyThread11 mt = new MyThread11(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }
结果:
卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
相关文章推荐
- 单车道问题 - 进程同步互斥与死锁问题的解决
- 在同步方法中调用异步方法时如何避免死锁问题
- 任务,线程和同步(六)之线程问题:争用条件和死锁
- 同步和互斥的一些问题(死锁,优先级逆转)
- 多线程——同步嵌套造成死锁问题
- java线程同步之死锁问题
- 黑马程序员_同步过程的死锁问题(哲学家难题)
- 黑马程序员----多线程2(安全问题、同步代码块、同步函数、死锁)
- 进程同步互斥——不死锁的哲学家问题
- 19-多线程(验证同步函数的锁) 21-多线程(单例模式涉及的多线程问题) 1 2 22-多线程(死锁示例) 23-Objcet放的位置产生的问题
- Linux环境下线程的同步与互斥以及死锁问题
- Java线程安全问题——同步和死锁
- Linux下线程的同步与互斥以及死锁问题整理
- Java总结(十)—实现Runnable接口创建线程,线程安全同步,死锁(哲学家进餐问题),读写锁
- 进程同步及避免死锁经典问题
- JAVA中关于同步与死锁的问题
- Lock同步锁完美搞定生产者与消费者死锁问题
- day11多线程,run方法。卖票多线程示例。synchronized,同步锁对象,回顾单例。死锁问题
- 操作系统清华向勇陈渝版笔记(九) 同步协同多道程序设计和并发问题,同步互斥,死锁,临界区
- J2SE学习笔记:多线程、单例模式延迟加载懒汉式同步、死锁问题