世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。 ——摘自周志明

JUC (java.util.concurrent)

1、什么是线程?什么是进程?

  

2、多线程的状态?

 public enum State {
        //6种状态
        NEW,
        RUNNABLE, //可运行  
        BLOCKED, //阻塞 
        WAITING,  //等待:一直等待,不见不散
        TIMED_WAITING,//过期不候
        TERMINATED; 
    }

3、并发?并行?※ ※ ※

  并发:同一时间间隔,交替执行任务。

  并行:同一时刻执行多个任务。

4、三个售票员卖票

  (1) 线程  操作  资源类

  (2)高内聚  低耦合

   代码在github上。

5、Lambda表达式

  函数式为实现接口:接口中有一个为实现的函数。jdk8接口,新增了静态方法和默认方法。因为有一个抽象方法,所以调用哪个方法是确定的。

  如何实现函数式接口:当只有一个抽象方法时,默认就是函数式接口。第二就是注解声明下,@FunctionalInterface

  口诀:拷贝小括号,写死右箭头,落地大括号。

6、ArrayList是线程安全的吗?不是

  并发修改会报错:java.util.ConcurrentModificationException

  Vector是线程安全的吗?是的,但是使用的synchronized,效率低?为啥synchronized就效率低呢?

   它是重量级锁,让线程排队一次执行,并发最差。

  怎么让ArrayList安全呢?

List<String> list = Collections.synchronizedList(new ArrayList<>());
//但是不推荐,高并发不好

7、juc最终boss,企业高并发用这个

List list = new CopyOnWriteArrayList();//写时复制技术

高并发集合容器

public class NotSafeDemo {
    public static void main(String[] args) {

        notSafeHashMap();
    }

    private static void notSafeHashMap() {
        Map<String, String> map = new ConcurrentHashMap<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 4));
                System.out.println(map);
            }, String.valueOf(i)).start();
        }
    }

    private static void notSafeHashSet() {

        Set<String> hashSet = new CopyOnWriteArraySet<String>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                hashSet.add(UUID.randomUUID().toString().substring(0, 4));
                System.out.println(hashSet);
            }, String.valueOf(i)).start();
        }
    }

    private static void noSafeArrayList() {
        List list = new CopyOnWriteArrayList();//写时复制技术

        //并发写,会报错:java.util.ConcurrentModificationException
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 4));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }
}

  底层原理:写时复制技术(写之前先复制一份,然后添加完,把引用指向写后的数组)

public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}

 

 

  

 

posted @ 2019-02-19 00:00  白杯与咖啡  阅读(258)  评论(0编辑  收藏  举报