Java零碎的记录

线程数量是不是越多越好?
不是。CPU在切换线程时,需要保存上一个线程的信息,比如执行到哪里。再次执行这个线程时,又需要恢复现场。这些线程之间的切换会消耗CPU资源。当线程数量很多时,会浪费很多的时间来进行线程的切换,反而降低了效率。

轻量级锁和重量级锁。
轻量级锁,即自旋锁不需要经过操作系统,重量级锁需要。
CAS是实现轻量级锁的一种方式。
早期的jdk版本中sync是重量级锁,之后才慢慢优化。

偏向锁不是一种锁。偏向锁的设计是为了优化那些百分之七八十时间只有一个线程在执行sync代码所设计的一把锁。当出现竞争时,偏向锁就会升级为自旋锁。

CAS导致的ABA问题,可以通过添加版本号解决。
另一个会产生的问题是比较和交换这个操作不是原子性操作。比如,有可能线程一刚执行取到a数据时是1,执行完后a++变为2,此时线程一再去比较原来的数据,比较完后发现a还是1,于是执行swap操作,结果恰巧有一个线程2修改了数据,把a修改为2了,于是就丢失了一次a的修改。多核CPU才有这样的问题,解决方法是执行比较和交换时,锁CPU总线,只允许此线程执行。

CPU的指令重排序。乱序执行的根源不是乱,是为了提高效率,把后面的指令拿过来先执行有可能能提高效率。CPU在执行指令时并不一定是顺序执行的。举个例子,CPU收到两条指令,第一条指令是从内存中读一个数据,由于CPU的速度大概是内存的100倍,CPU发出一条指令去内存中读数据但是等数据回来要等99个时钟周期,然后再执行第二条指令,这样会浪费CPU的时间。

引用。
强软弱虚。
Object o = new Object()就是强引用。

数据库的ACID。
A原子性。innodb原子性怎么保证的?undo log。在操作数据库前,先备份数据到某个地方,这个地方就是undo log。在出现了错误或者执行了rollback时,就可以从undo log中获取备份的数据恢复到执行之前的情况。undo log是一种逻辑日志,可以理解为当insert一条数据时,日志中响应记录一条delete语录。update一条语句时,响应的记录一条相反的update语句。当delete一条语句时,相应的记录一条insert语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值