5.1
1、RestTemplate:远程调用http接口
2、同步锁Synchronized:方法锁【抢票】(方法锁也是对象锁,方法一旦执行,就会独占该锁【写锁】,否则所属线程阻塞,可能会多个线程调用同一对象【结果非最新】)、对象锁【银行取钱】(在执行方法时,会确保对象有且只有一个线程调用)、类锁【手机打电话发短信】(对象模板锁,方法前加static synchronized)
3、可重复锁ReentrantLock:显示锁,手动开启/关闭,只有代码块锁,JVM花费较少时间调度线程,默认非公平(非公平才是最公平的)
优先级:Lock>同步代码块>同步方法
4、生产者消费者的2种方法:flag标志位、集合空满状态。 ①判断等待this.wait() ②业务 ③通知this.notifyAll();
虚假唤醒问题:唤醒条件不满足继续等待==>等待应该总出现在循环中(if->while)
5、生产者和消费者问题之Locked搭配监视器Condition监控线程调度:①判断等待condition.await() ②业务 ③通知condition.signalAll()
几个线程互相通知就需要几个监视器互相告知。
6、集合安全:List ArrayList(扩容1.5,长度+长度>>1【÷2】)、Set HashSet(底层HashMap,key不能重复)、Map HashMap(new HashMap(16,0.75f);初始化容量 capacity:1 << 4 (1*2^4)=16 ;最大值:加载因子:0.75f)
Collections.synchronizedList(new ArrayList<>()); new CopyOnWriteArrayList<>();
Collections.synchronizedSet(set); new CopyOnWriteArraySet();
Collections.synchronizedMap(map); new ConcurrentHashMap<>();
7、三大辅助类:CountDownLatch(减法计算器)、CyclicBarrier(加法计算器)、Semaphore(信号量并发限流)
new CountDownLatch(6);//i=6 countDownLatch.countDown();//i-- countDownLatch.await();//阻塞等待,直到结果为0 核心代码在阻塞之后
new CyclicBarrier(7,()->{ runnable核心代码 });//i=7 cb.await();//等待,满了之后才执行开会
new Semaphore(3);//容量3 sp.acquire();//抢到资源 sp.release();//释放资源
8、读写锁: ReentrantReadWriteLock(); 读锁(共享锁)lock.readLock().lock()【unlock】;、写锁(独占锁)lock.writeLock().lock()【unlock】
9、阻塞队列:BlockingQueue。四组API:add、remove(常规,异常抛出);offer、poll(不抛异常,超时等待);put、take(阻塞等待)
10、同步队列:SynchronousQueue。new SynchronousQueue<>(); a.put("1"); a.take(); 类似于Semaphore
11、线程池:3大方法(单例、固定长度、可变长度)、7大参数(核心线程、最大线程、等待时间、单位、阻塞队列、默认、拒绝策略)、4种拒绝策略(满抛异常、满就丢弃、满尝试竞争、满从哪来到哪去)。
12、Lamdba表达式:简化编程。用于函数时接口。
13、函数时接口:是接口有且仅有一个抽象方法。如Runnable 。new Thread (()->{ 方法体});
四大函数式接口:函数型Function(输入输出)、断定型Predicate(输入bool输出)、消费型Consumer(输入)、供给型Supplier (输出)
14、Stream流式计算:中间操作(filter、sort、map、limit、distinct)、最终操作(forEach、match[allMatch、anyMatch、noneMatch]、count、reduce)。Collection.stream();
LongStream.rangeClosed(1L, 10_0000_0000L).parallel().reduce(0,Long::sum);//累加1-10E
15、链式编程:Collection.stream().filter().sort().map().limit(1).distinct().forEach();