lombok 和 groovy 冲突
springboot web的坑
WebMvcConfigurationSupport 会屏蔽掉EnableAutoConfiguration 的web配置
WebMvcConfigurerAdapter 则不会
单例模式
特征
在运行时阶段只能有一个对应类的实例对象
实现要点
- 私有构造
似有构造控制对象的构建权利, 只赋给类本身
- 对外的实例引用
单例的使用入口
饿汉式实现
要点: 静态属性, 直接在类初始化时实现
1 | package com.luozi.designpatterns.singleton; |
对象什么时候实例化呢, 类的生命周期中, 当类被直接引用的(一般是使用类的时候, 具体参照类的生命周期那片文章)时候, 会触发类的初始化, 这个时候就会依次执行类中的静态语句, 这里是创建单例
懒汉式实现
要点: 双重校验, 在获取单例时实例化; volatile 关键字保证值在线程间可见
1 | package com.luozi.designpatterns.singleton; |
java泛型相关的问题
有一个方法, 需要传入所有类型的Number集合, 包括 List<Integer>, List<Double>, 设计一下方法签名
不能使用这种方法签名doSomething(List<Number> numbers) , 会报 doSomething(java.util.List<Number> numbers) can't applied to java.util.List<Integer>
使用以下两种方法签名都可以编译通过
1 | doSomething(List<? extends Number> numbers) |
建议使用第一种, 这样对方法的参数没有做侵入, 让调用明确知道需要传入List<Number >
两个擦出后一样的方法签名编译能否成功, 比如 void do(List<Integer> numbers), void do(List<Double> numbers)
不会, 编译器会认为这两个方法签名一样, both method has same erasure
泛型赋值的问题
List<Integer> 是不能赋值给 List<Number>的, 但可以赋值给 List<? extends Number>, eg:
1 | List<Integer> integers = new ArrayList<>(); |
java线程内通信与跨线程通信
threadLocal, 是线程内通信利器
新建一个threadLocal对象后, 当使用set的时候, 对象会以自身为key, 将set的值存入当前线程对象内的一个map中.
当在线程内想要使用该threadLocal set的值的时候, 直接get就可以拿到, 在jdk 1.5后, 通过threadLocal存放在线程中的 值, 会随着线程的销毁而慢慢被jvm回收掉.
但需要注意的是在springmvc这种框架中, 针对api请求使用了线程池技术, 在单个请求结束后, 线程本身不一定会销毁, 会在新的请求过来的时候重新启用, 针对这种情况, 如果针对每次请求共享数据, 必须在请求结束后remove掉通过 threadlocal set的值
- demo, 带编写
- 疑惑, springmvc的请求线程回收时机, 待处理
跨线程通信
在java 单进程中
- 使用 wait notity notifyAll()
wait 和 notify 必须在 synchronized 代码块中, 且synchronized对象必须为同一个
不建议直接使用wait 和 notify , 建议使用java.util.concurrent包中的并发组件
实例demo, 待优化
1 | package com.luozi.thread; |
- 使用 condition, 类似的wait, notify, notifyall的效果
如果在代码中不使用 synchronized关键字, 而使用 Lock, 一般是 ReenTrantLock来做同步控制, 可以使用 lock.newCondition 来达到类似的wait, notify, notifyall的效果
对应的方法变成了 await(), signal(), signalAll()
- 使用管道流
pipedInputStream pipedOutputStream
po.close(pi)
线程A 通过 输入流输入数据, 线程B 通过输出流读取数据
- 并发队列
ConcurrentLinkedQuene 非阻塞
ArrayBlockingQuene LinkedBlockingQuene 阻塞 set满了 或者 poll空了会阻塞住
ArrayBlockingQuene LinkedBlockingQuene 的区别 循环顺序表 和双向链表
如何愉快地安装node
建议用nvm管理node
1 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.0/install.sh | bash |
nvm每次将node安装到当前用户的home目录下, 所以启动用户务必和安装用户是同一个用户来规避权限问题
配置 .npmrc 使用淘宝镜像
1 | registry=https://registry.npm.taobao.org/ |
配置常用的node工具
有时候系统找不到那些node应用的启动命令. 需要单独将这些命令放到 PATH 中
1 | export PATH=${node's bin path}:$PATH |
跨服务器文件传输
在服务器间同步文件时, 用rsync命令比较快捷, 能够避免重复的传输, 删除多余的文件
1 | rsync --delete -av --exclude './exclude_file' "${source_directory}" ${user}@${server}:${desc_directory} |
-- delete 表示删除目标目录存在, 原目录不存在的文件
-av 表示打印传输过程
--exclude 表示排除掉某些文件不做传输
"${source_directory}" 源文件目录. eg: /data/tmp/
${desc_directory} 目标服务器目录.