1、基础2.线程和进程:1.线程六个状态:2.wait和sleep的区别:3、Lock锁(重点)传统 Synchronized:不公平锁Lock接口:公平锁:十分公平:可以先来后到非公平锁:十分不公平:可以插队 (默认)Synchronized 和 Lock 区别:1、 Synchronized 内置的Java关键字, Lock 是一个Java类2、 Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁3、 Synchronized 会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁4、 Synchronized 线程 1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下去;5、 Synchronized 可重入锁,不可以中断的,非公平;Lock ,可重入锁,可以 判断锁,非公平(可以自己设置);6、 Synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码! 4、生产者和消费者问题 面试的:单例模式、排序算法、生产者和消费者、死锁生产者和消费者问题 Synchronized 版解决if用While5.lock与Synchronized对应的方法:Synchronized:(重):多个线程用同一个对像,调用同一个类被Synchronized锁的方法,变量,线程都只能一个一个来调用!多个线程如果用的是不同对像(不同的类),调用被Synchronized锁的方法,变量,线程不相干扰!static修饰的概念是类的模板,任何类还没加载就要先加载类它的模板,类的模板只有一个。如果被static(静态修饰),就算用不同的对象(名字)声明,static修饰的都是指向它唯一的类模板,只能一个一个调用!6、Condition的使用lockd等待,唤醒方法:condition1.signal();唤醒condition1Lock-精准唤醒:7、List的安全List<String> list = new CopyOnwriteArrayList<>();8、Set的安全Set<string> set = new CopyOnwriteArrayset<>();9、map的安全Collections.synchronizedMap(Map<K,V> m) )可以代替HashMap,但是它们都是通过使用一个全局的锁来同步不同线程间的并发访问,因此会带来不可忽视的性能问题。Map<string, string> map = new ConcurrentHashMap<>(); ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。本文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁和分段锁机制的内在奥秘和原理。11、常用辅助类CountDownLatch线程减法计数器CyclicBarrier线程加法计数器Semaphore12、读写锁使用没有加锁时:结果读锁和写锁又名(独占锁和共享锁)结果总结13、阻塞队列队列和阻塞BlockingQueue总1、抛出异常:2、返回Boolean值3、一直阻塞4、超时等待14、同步队列SynchronousQueueBlockingQueue<String> blockingQueue = new SynchronousQueue<>(); //同步队列结果:总结15、线程池Executors线程池Executors线程池三大方法1、单个线程池2、固定线程池3、可伸缩线程池三大方法本质ThreadPoolExecutor1、阿里巴巴规范手册说明2、ThreadPoolExecutor七大参数2、ThreadPoolExecutor四种拒接策略1、2、3、4、池大小设置优化1、CPU密集型2、IO密集型16、四大函数式接口1、Function函数式接口还能把括号去掉2、断定型接口3、Consumer消费型接口4、 Supplier供给型接口17、Stream流式计算(1.8新特性)18、ForkJoin1、ForkJoin的特点:工作窃取双端队列2、使用和对比使用三种方法计算1+到10亿的值1、普通For循环2、ForkJoin2.1、编写计算类2.2、创建ForkJoin工厂执行计算3、Stream流式计算一行代码4、结果19、异步回调CompletableFuture1、没有返回值()2、有返回结果(supplyAsync)20、JMMJMM的八种指令21、Volatile1、保持可见性缓存锁:总线加锁缓存一致性协议2、不保证原子性如:多线程调用num++;除了加锁lock和synchronized还有原子类可以保证原子性原子类CAS
实现3、避免指令重排Volatile的实现(2)禁止指令重排底层原理:
volatile实现禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象。
先了解下概念,内存屏障(Memory Barrier)又称内存栅栏,是一个CPU指令,它的作用有两个:保证特定操作执行的顺序性;
保证某些变量的内存可见性(利用该特性实现volatile内存可见性)volatile实现禁止指令重排优化底层原理:
由于编译器和处理器都能执行指令重排优化。如果在指令间插入一条Memory Barrier则会告诉编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排,也就是说通过插入内存屏障,就能禁止在内存屏障前后的指令执行重排优化。内存屏障另外一个作用就是强制刷出各种CPU的缓存数据,因此任何CPU上的线程都能读取到这些数据的最新版本。左边:写操作场景:先LoadStore指令,后LoadLoad指令。右边:读操作场景:先LoadLoad指令,后LoadStore指令。22、单例模式概念: java中单例模式是一种常见的设计模式,单例模式的写法有很多种,比较常见的有三种:懒汉式、饿汉式、内部类、双重验证。
单例模式有以下特点:
1、单例类只能有一个实例(new 的对象)。
2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 单例模式确保该类只被是实例化一次,并且只能自己实例化自己。若想某一类不在类外被实例化,只需用private修饰符修饰其构造函数。1、饿汉式2、懒汉式3、静态内部类式23、深入理解CASAtomicInteger1、Unsafe类ABA问题
通俗来讲就是你大爷还是你大爷,你大妈已经不是你大妈了^_^(他已经被动过了)代码实现
解决办法如果线程one操作不被中断,那么问题就解决了将类变成原子类操作过程添加版本号即为下面的原子引用!24、原子引用AtomicStampedReference但是Integer类型的范围是-128~127,超出范围会在堆里面新建一个对象并不会复用对象你自己看一下源码compareAndSet源码,底层是用==进行判断带版本号的原子类
它被人动过,版本号就不是原来的版本号了25、各种锁的理解1、公平锁和非公平锁
可重入锁是指:某个线程已经获取了某个锁,那么他可以再次获取该锁而不陷入死锁总结下:什么是 "可重入",可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。3、自旋锁4、死锁解开死锁,避免死锁产生的条件就可以了ThreadLocal的原理和使用场景区别:111111111111