Java多线程的例子及synchronized关键字锁定对象的用法
2012-12-15 23:02
591 查看
该例子所应用场景:一个线程负责生产,多个线程(该例为3个)负责消费;生产者不断的往堆栈中加入数据,消费者不断的从堆栈中取数据。
代码如下:
代码如下:
package com.xs.mail.thread; import java.util.ArrayList; import java.util.List; class Widget { } class WidgetMaker extends Thread { List<Widget> finishedWidgets = new ArrayList<Widget>(); public void run() { try { while (true) { //每1秒钟生产一个Widget Thread.sleep(1000);// act busy Widget w1 = new Widget(); // 也就是说需要5秒钟才能新产生一个Widget,这决定了一定要用notify而不是notifyAll // 因为上面两行代码不是同步的,如果用notifyAll则所有线程都企图冲出wait状态 // 第一个线程得到了锁,并取走了Widget(这个过程的时间小于5秒,新的Widget还没有生成) // 并且解开了锁,然后第二个线程获得锁(因为用了notifyAll其他线程不再等待notify语句 // ,而是等待finishedWidgets上的锁,一旦锁放开了,他们就会竞争运行),运行 // finishedWidgets.remove(0),但是由于finishedWidgets现在还是空的, // 于是产生异常 // ***********这就是为什么下面的那一句不能用notifyAll而是要用notify synchronized (finishedWidgets) { finishedWidgets.add(w1); finishedWidgets.notify(); // 这里只能是notify而不能是notifyAll } } } catch (InterruptedException e) { } } public Widget waitForWidget() { synchronized (finishedWidgets) { if (finishedWidgets.size() == 0) { try { System.out.println("暂停线程:" + Thread.currentThread().getName()); finishedWidgets.wait(); } catch (InterruptedException e) { } } return finishedWidgets.remove(0); } } } public class WidgetUser extends Thread { private WidgetMaker maker; public WidgetUser(String name, WidgetMaker maker) { super(name); this.maker = maker; } public void run() { while (true) { Widget w = maker.waitForWidget(); System.out.println(getName() + " got a widget"); } } public static void main(String[] args) { WidgetMaker maker = new WidgetMaker(); maker.start(); new WidgetUser("Tom", maker).start(); new WidgetUser("Jack", maker).start(); new WidgetUser("Marry", maker).start(); } }
相关文章推荐
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java中synchronize关键字的理解 在多线程环境下的应用: synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. syn
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java多线程 synchronized关键字的一些用法
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- Java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java 多线程(4) 线程同步之锁(synchronized) / 死锁 / 两个锁定对象期间访问(修改)其变量的面试
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- Java多线程(二) synchronized 针对对象进行锁定
- (原)测试 Java中Synchronized锁定对象的用法
- java 使用synchronized关键字锁定的对象
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- Java 多线程:synchronized 关键字用法
- Java 多线程:synchronized 关键字用法(修饰类,方法,静态方法,代码块)
- Java 多线程:synchronized 关键字 3ff0 用法(修饰类,方法,静态方法,代码块)
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java synchronized关键字的用法以及锁的等级:对象锁、类锁
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
- Java多线程系列--【基础篇04】-synchronized关键字
- Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理