线程池的构建:
    首先从线程池开始说起:
    目前比较快速的构建线程池的方法是:

    1. ExecutorService e = Executors.newCachedThreadPool();
    2. ExecutorService e = Executors.newSingleThreadExecutor();
    3. ExecutorService e = Executors.newFixedThreadPool(3);
    4. // 第一种是可变大小线程池,按照任务数来分配线程,
    5. // 第二种是单线程池,相当于FixedThreadPool(1)
    6. // 第三种是固定大小线程池。
    7. // 然后运行
    8. e.execute(new MyRunnableImpl());

    构建好线程之后我们需要做的就是运行任务:
    比如我们运行一个给一个值sum进行++运算:

    1. @Override
    2. public void run() {
    3. // System.out.println(currentThread().getName() + " : " + sum++);
    4. ThreadLocal threadLocal = new ThreadLocal();
    5. threadLocal.set(sum);
    6. System.out.println(currentThread().getName() + "_sum : " + sum++);
    7. System.out.println(currentThread().getName() + "_threadLocal : " + threadLocal.get());
    8. }

    多线程构建后带来的问题:
    线程安全问题:
    性能问题:
    活跃性问题:

    多线程—锁(lock)的作用/使用

    线程的原子性:

    如何设计一个线程安全的类

    队列问题:
    阻塞式队列:当一个有边界队列被塞满了的时候队列会阻止生产者继续存放,当队列内无任何内容的时候阻止消费者继续获取;
    非阻塞式队列:ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出(FIFO)的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。 入队和出队操作均利用CAS(compare and set)更新,这样允许多个线程并发执行,并且不会因为加锁而阻塞线程,使得并发性能更好。

    LIFO:表示后进先出,java栈就是一个实现