面试题

满足一下条件

  • 定义一个容器 提供添加元素和获取元素数量的 方法
  • 启动两个线程 第一个添加元素,第二个获取元素,当第二个获取的元素的长度为5时 结束这个线程

1,使用 volatile

public class Test {
    
    public static void main(String[] args) {
        
        Container container = new Container();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    container.add(new Object());
                    System.out.println("add Object - "+ i);
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {
                    if(container.size()==5) {
                        System.out.println("t2 size() : 5");
                        break;  
                    }   
                }
            }
        }).start();
    }

}

class Container {
    volatile List<Object> container  = new ArrayList<Object>();
    
    public void add(Object o) {
        container.add(o);
    }
    
    public int size() {
        return container.size();
    }
}

2 ,使用CountDownLatch

public class Test {
    public static void main(String[] args) {
        Container container = new Container(); 
        CountDownLatch latch = new CountDownLatch(1);
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    container.add(new Object());
                    System.out.println("add Object() - "+ i);
                    if(container.size()==5) {
                        latch.countDown(); //减去一个门闩
                    }
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                
            }
        }).start();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(container.size()!=5) {
                    try {
                        latch.await();  //等待门闩开放
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("t2 size() 5");
            }
        }).start();
    }
}

class Container {
    List<Object> container  = new ArrayList<Object>();
    
    public void add(Object o) {
        container.add(o);
    }
    
    public int size() {
        return container.size();
    }
}

3,wait() 和notifyAll()

public class Test {
    public static void main(String[] args) {
        Container container = new Container();
        Object lock = new Object();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    for (int i = 0; i < 10; i++) {
                        container.add(new Object());
                        System.out.println("add Object - " + i);
                        try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                        
                        if(container.size()==5) {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        lock.notifyAll();
                    }
                }
                    
            }
        }).start();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    if(container.size()!=5) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("t2 size() 5");
                    lock.notifyAll();
                }   
            }
        }).start();
        
    }
}

class Container {
    List<Object> container  = new ArrayList<Object>();
    
    public void add(Object o) {
        container.add(o);
    }
    
    public int size() {
        return container.size();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,140评论 0 8
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 1,992评论 0 8
  • 转自CSDN文章:Java面试题集 求职是在每个技术人员的生涯中都要经历多次。对于我们大部分人而言,在进入自己心仪...
    流浪java阅读 817评论 0 12
  • 对于这个年纪的我们,“结婚”无非是别人眼中最好的期许,我与前任便是那样。但大家都明白,人心都是肉长的,有些事经历之...
    果子tra阅读 1,181评论 0 6
  • 《你就是孩子最好的玩具》当孩子耍脾气的时候怎么办? 孩子之所以会耍脾气,是因为他们具有一种天生的,自然的本能,想要...
    M__Z阅读 264评论 0 0