面试题

作者: larQ | 来源:发表于2018-10-31 21:44 被阅读0次

满足一下条件

  • 定义一个容器 提供添加元素和获取元素数量的 方法
  • 启动两个线程 第一个添加元素,第二个获取元素,当第二个获取的元素的长度为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();
    }
}

相关文章

  • 面试材料

    面试经验 面试题1 面试题2 面试题3 面试题4 面试题5 面试题6――数据结构 面试题7――网络 面试题8――汇...

  • 高阶面试题

    webpack面试题 面试题:webpack插件 Git面试题 面试题:git常用命令 面试题:解决冲突 面试题:...

  • this的指向的面试题

    面试题1 面试题2 面试题3 面试题4

  • 面试所涉及的问题

    面试题参考1 : 面试题 面试题参考2 : 内存管理 面试题参考3 :面试题 ...

  • Android超实用最全面试大纲(三)

    文章目录: ANR面试题 OOM面试题 Bitmap面试题 UI卡顿面试题 内存泄漏面试题 内存管理面试题 一、A...

  • Android最全面试大纲(三)

    文章目录: ANR面试题 OOM面试题 Bitmap面试题 UI卡顿面试题 内存泄漏面试题 内存管理面试题 一、A...

  • 2022年web前端面试题

    web前端面试题分为:html/css面试题、javascript面试题、vue面试题、性能优化面试题、网络方面面...

  • ios面试题

    初级面试题 中级面试题 高级面试题 swift篇

  • Android超实用最全面试大纲(四)

    文章目录: 冷启动和热启动面试题 其他优化面试题 架构模式面试题 插件化面试题 热更新面试题 进程保活面试题 Li...

  • Android最全面试大纲(四)

    文章目录: 冷启动和热启动面试题 其他优化面试题 架构模式面试题 插件化面试题 热更新面试题 进程保活面试题 Li...

网友评论

      本文标题:面试题

      本文链接:https://www.haomeiwen.com/subject/wduztqtx.html