ARTS (第67周)
业精于勤疏于嬉,行成于思毁于随
Algorithm 算法
最简单的编译器2(加减乘除、优先级)
AST和TOKEN
1 | package compiler.demo1.ast; |
1 | package compiler.demo1.ast; |
1 | package compiler.demo1.token; |
1 | package compiler.demo1.token; |
1 | package compiler.demo1.token; |
1 | package compiler.demo1.token; |
解析、编译器
1 | package compiler.demo1.compile2; |
1 | package compiler.demo1.compile2; |
测试
1 | package compiler.demo1.compile2; |
Review 英文文章
https://spring.io/guides/tutorials/spring-boot-oauth2/ spring整合oatuth2
Tip 技巧
JMM内存模型三大特性
1、原子性
AtomicInteger使用 synchronized 互斥锁来保证操作的原子性
2、可见性:
volatile,会强制将该变量自己和当时其他变量的状态都刷出缓存。
synchronized,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。
final,被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程通过 this 引用访问到初始化了一半的对象),那么其它线程就能看见 final 字段的值。
3、有序性
源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 ->最终执行的命令
重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性
内存屏障
1、LoadLoad Barriers 参考指令:Load1;LoadLoad;Load2
该屏障确保Load1数据的装载先于Load2及其后所有装载指令的的操作
2、StoreStore Barriers 参考指令:Store1;StoreStore;Store2
该屏障确保Store1立刻刷新数据到内存(使其对其他处理器可见)的操作先于Store2及其后所有存储指令的操作
3、LoadStore Barriers 参考指令:Load1;LoadStore;Store2
确保Load1的数据装载先于Store2及其后所有的存储指令刷新数据到内存的操作
4、StoreLoad Barriers 参考指令:Store1;StoreLoad;Load2
该屏障确保Store1立刻刷新数据到内存的操作先于Load2及其后所有装载装载指令的操作。它会使该屏障之前的所有内存访问指令(存储指令和访问指令)完成之后,才执行该屏障之后的内存访问指令
另外,StoreLoad Barriers同时具备其他三个屏障的效果,因此也称之为全能屏障(mfence),是目前大多数处理器所支持的;但是相对其他屏障,该屏障的开销相对昂贵。
Share 分享
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 数据结构可视化
https://blog.csdn.net/a602519773/article/details/86086655 maven打包项目 包含与不包含依赖打包方式
https://zhidao.baidu.com/question/454840655563209205.html /usr、/home、/bin、/dev、/var、/etc中主要存放什么文件