Java高并发编程——常见问题、举例(4)

14、一道面试题引发的思考

曾经的面试题:(淘宝?)
实现一个容器,提供两个方法,add,size
写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束

14.1分析下面这个程序,能完成这个功能吗?
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;


public class MyContainer1 {
   
    
    //添加volatile,使t2能够得到通知
	/*volatile*/ List lists = new ArrayList();

	public void add(Object o) {
   
		lists.add(o);
	}

	public int size() {
   
		return lists.size();
	}
	
	public static void main(String[] args) {
   
		MyContainer1 c = new MyContainer1();

		new Thread(() -> {
   
			for(int i=0; i<10; i++) {
   
				c.add(new Object());
				System.out.println("add " + i);
				
				try {
   
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
   
					e.printStackTrace();
				}
			}
		}, "t1").start();
		
		new Thread(() -> {
   
			while(true) {
   
				if(c.size() == 5) {
   
					break;
				}
			}
			System.out.println("t2 结束");
		}, "t2").start();
	}
}

输出结果:
add 0
add 1
add 2
add 3
add 4
add 5
add 6

分析:上面的程序不能实现题目要求,两个线程之间,lists并不具有可见性,给lists添加volatile之后,程序就可以实现题目要求,使t2能够接到通知,但是,t2线程的死循环很浪费cpu,如果不用死循环,该怎么做呢?

#####14.2阅读下面的程序,能否实现上述面试题目要求?并分析输出结果

import java.util.ArrayList;
import java.util.List;
import java.util

你可能感兴趣的:(java学习,多线程,java,并发编程)