<input type="hidden" name="huserInfo" id="huserInfo" value='${huserInfo}'>
5. linux 中tar命令:
压缩:tar -czvf file.tar filename
解压:
tar -xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
6. 涉及到list 多线程异步动态增加删除时,arraylist 不可用,此时可以用concurrent 包里的ConcurrentLinkedDeque,队列.
ConcurrentLinkedQueue 是单向链表结构的无界并发队列。元素操作按照 FIFO (first-in-first-out 先入先出) 的顺序。适合“单生产,多消费”的场景。内存一致性遵循对ConcurrentLinkedQueue的插入操作先行发生于(happen-before)访问或移除操作。
ConcurrentLinkedDeque 是双向链表结构的无界并发队列.
ConcurrentLinkedQueue .toArray(T[] a) 可以转成array数组。 比如:
queue.toArray(new StompSession[0].
注意toArray方法:
List接口的toArray()方法就是直接调用Arrays.copyOf(elementData, size),将list中的元素对象的引用装在一个新的生成数组中。
List接口的toArray(T[] a)方法会返回指定类型(必须为list元素类型的父类或本身)的数组对象,如果a.length小于list元素个数就直接调用Arrays的copyOf()方法进行拷贝并且返回新数组对象(不是a,是新生成了一个数组对象),新数组中也是装的list元素对象的引用,否则先调用System.arraycopy()将list元素对象的引用装在a数组中,如果a数组还有剩余的空间,则在a[size]放置一个null,size就是list中元素的个数,这个null值可以使得toArray(T[] a)方法调用者可以判断null后面已经没有list元素了。
基准测试ArrayList的toArray方法:
//速度排名 1
@Benchmark
public Object[] simple() {
return LIST.toArray();
}
//速度排名 2,性能最好,推荐使用
@Benchmark
public Character[] zeroCached() {
return LIST.toArray(EMPTY_CHAR_ARRAY);
}
//速度排名 3
@Benchmark
public Character[] zero() {
return LIST.toArray(new Character[0]);
}
//速度排名 4
@Benchmark
public Character[] sized() {
return LIST.toArray(new Character[LIST.size()]);
}
结果:
Benchmark Mode Cnt Score Error Units
ToArrayPerfTest.simple avgt 5 37.278 ± 0.669 ns/op
ToArrayPerfTest.sized avgt 5 59.346 ± 0.272 ns/op
ToArrayPerfTest.zero avgt 5 49.682 ± 1.067 ns/op
ToArrayPerfTest.zeroCached avgt 5 47.982 ± 1.024 ns/op
7. SpringBoot启动加载数据CommandLineRunner:
SpringBoot应用程序在启动时,会遍历CommandLineRunner接口的实例并运行他们的run()方法。也可以利用@Order注解或者Order接口来规定所有CommandLineRunner实例的运行顺序。
8. java8: Map.computeIfAbsent(k,(k-v)->v):
computeIfAbsent:存在时返回存在的值,不存在时返回新值
9. ReentrantReadWriteLock: 读写互斥锁,只有读读共享,有写都会互斥,以此可得出读读共享,写写互斥,读写互斥,写读互斥。 基准测试BenchMark 后发现 lock 与sync性能差不多
10. 循环依赖:使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析:
@Slf4j
@Service
public class B {
@Lazy
@Autowired
private B b;
public void test() {
this.b.tran();
}
//必须为 public 以便能够被代理
@Async
@Transactional
public void tran() {
log.info("ddd");
}
}
如果是 @Transactional 可以不加 @Lazy
如果是 @Async 必须加 @Lazy , 否则 启动 spring boot 报错.. 原理参考 使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案【享
11. 【读阿里巴巴开发手册有感】-1:
比较的时候 java.sql.TimeStamp 的毫秒不会参与比较,为 000, 所以同一个秒内的两个时间, 一个为new Date,一个为new Timestamp, 用 before 和 after 比较时,Date 的总是大于 TimeStamp,所以程序种不要使用TimeStamp
12. StringBuilder:
1)循环中需要使用StringBuilder来操作字符串拼接工作,不要使用string += str,因为反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费,这虽然减少了jvm常量池的压力,但也无疑增加了jvm中新生代的压力(增加了垃圾回收的几率)
2)普通代码中使用加号连接字符串会被jvm优化成使用StringBuilder拼接
13. 局域网拷贝:
15.
## 创建时间插入时更新,更新时间在更新时才更新
ALTER TABLE cdk_wd_sysapi_log_oms
MODIFY COLUMN created_date timestamp NULL DEFAULT CURRENT_TIMESTAMP,
MODIFY COLUMN last_up_date timestamp NULL DEFAULT null ON UPDATE CURRENT_TIMESTAMP;
16. 一个普通的bean, 能否作为map的key? 需要注意什么?
重写equals和hashcode方法
17. synchronized 方法的实现是在锁定的对象上加锁, 方式锁定对象的最开始的两位设置为锁, 俗称markWord
17.2 volatile : 两个特点
memory =allocate(); //1:分配对象的内存空间
ctorInstance(memory); //2:初始化对象
instance =memory; //3:设置instance指向刚分配的内存地址
我们可以看出 第一条指令对第二条指令有依赖关系,但是第二条指令与第三条指令并没有依赖关系,所以根据JVM指令重排的规矩可以对第二条与第三条指令的执行顺序进行交换,这样看起来没有什么问题,但是在多线程中这样就会产生问题了
解决方案
给单例类中引用的instance加上volatile关键字,volatile关键字有一个作用就是防止JVM对其进行指令重排序
在 volatile 变量的赋值操作后面会有一个内存屏障,大多数的处理器都支持内存屏障的指令。
单例模式: 有懒汉模式,饿汉模式
17.3 CAS : compare and set: 比较并且设定, 无锁优化 自旋, 利用CPU原语Unsafe; Automic方法是使用CAS,
18. @Transactional 注解加在private方法上不起作用;
serviceA.methdA 里面调用本类方法@Transactional .methodB, 如果不加serviceA. , 则事务注解不起作用, 需要serviceA.methB调用. serviceB 本类注入使用延迟注入注解@Lazy
19. 1. oracle: mybatis中用Map接收oracle的结果集key默认是大写的: select name as "name" from detail; 这样处理即可,注意是双引号, as "name"
20: ZK保证一致性, 但不能保证可用性: 因为可能master与其他集群失去联系, 此时会重新推荐master 导致整个zk不可用,
Eureka 保证可用性: 各个节点平衡, 如果挂掉一个, 其他不受影响, 所以服务会一直可用;
21. on duplicate key update 存在即修改。但是当修改时,数据库中没有字段值变化,即返回的影响行为0时,这时是不返回主键的!!!!!!
所以要确保一定有主键返回,就必须让mysql有影响行
on duplicate key update 修改时如果原值保存,就不能确保一定有字段值更新,就不保证一定有影响行,确保影响行就是加上更新时间字段,每次带上。updated_at = NOW(); 最为合适
请不要依赖Mysql datetime的 修改自动填入值 (ON UPDATE CURRENT_TIMESTAMP),因为影响行依然为0;
22. truncate = drop+create, 是新建了一张表, 自增主键会从1开始;
delete 是一行一行的删除, 自增主键不会重置, 会继续
trop 直接删除了表, 表不存在;
23. ulimit -a 查看inginx最大接入量
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务