原文: http://www.java2000.net/p11416
题目来自论坛,有兴趣的可以去看看
http://topic.youkuaiyun.com/u/20081030/22/31029956-fa0d-46a5-8b14-e9c971f29054.html
重点是,1 保证只有2个实例可用,且每个实例的方法做成同步。
- import java.util.concurrent.BlockingDeque;
- import java.util.concurrent.LinkedBlockingDeque;
- /**
- * 一个方法最多2个线程同时使用的实现。<br>
- * 使用BlockingDeque保证同步的机制和阻塞访问。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
- public class Test extends Thread {
- public static void main(String[] args) {
- for (int i = 0; i <= 10; i++) {
- new Test().start();
- }
- }
- public void run() {
- int i = 2;
- while (i-- > 0) {
- OnlyTwo o = OnlyTwo.getInstance();
- o.test();
- OnlyTwo.returnInstance(o);
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- class OnlyTwo {
- private static int NUM = 1;
- private String name;
- private OnlyTwo() {
- name = "NUM" + NUM;
- NUM++;
- }
- private static BlockingDeque<OnlyTwo> data = new LinkedBlockingDeque<OnlyTwo>(
- 2);
- static {
- data.push(new OnlyTwo());
- data.push(new OnlyTwo());
- }
- public static OnlyTwo getInstance() {
- try {
- return data.takeFirst();
- } catch (InterruptedException e) {
- e.printStackTrace();
- return null;
- }
- }
- public static void returnInstance(OnlyTwo t) {
- try {
- data.putLast(t);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- public void test() {
- // 实例同步,避免对象被重复使用
- synchronized(this){
- System.out.println("test" + name);
- }
- }
- }
学无止境。。。