Java开发知识记录

一:基本类型的装拆箱场景:

特点: 
      装箱操作会创建对象,频繁的装箱操作会消耗许多内存,影响性能,所以可以避免装箱的时候应该尽量避免。
      当两种不同类型用==比较时,包装器类的需要拆箱, 当同种类型用==比较时,会自动拆箱或者装箱    
    1、当一个基础数据类型与封装类进行==、+、-、*、/运算时,会将封装类进行拆箱,对基础数据类型进行运算
    2、不同类型的包装类equals比较返回的应该是false,因为基础数据类型都重写了equals方法,会先判断是不是相同类型,如果是才会判断值是否一致
    3、Byte,Short,Character,Boolean,Integer,Long -- 在指定范围都是可以读取缓存的
    4、equals(Object o) 因为原equals方法中的参数类型是封装类型,所传入的参数类型(a)是原始数据类型,所以会自动对其装箱,反之,会对其进行拆箱
    5、当两种不同类型用==比较时,包装器类的需要拆箱, 当同种类型用==比较时,会自动拆箱或者装箱

 二:代码优化技巧: 

    1、提前return--if/else时,如果else中是方法结束,可以直接在if中取反,先处理else的逻辑,这样便减少了else语句
    2、策略模式--通过类的多态实现
    3、使用枚举
    4、使用Optional,减少非空的判断
    5、使用数据小技巧,如返回每个月的天数,可以将12个月的天数存储在数组中,不需要再if后面返回

三: 可重入锁(递归锁)/不可重入锁(自旋锁):

    可重入锁: 一个线成可以获取已经油它自己持有的锁(即:在同步方法中再调用同步方法,不会产生死锁)
    可重入锁的工作原理很简单,就是用一个计数器来记录锁被获取的次数,获取锁一次计数器+1,释放锁一次计数器-1,当计数器为0时,表示锁可用。
    作用: 避免重复获取的时候出现死锁
    
    总结:     
          可重入锁、不可重入锁,针对的对象是同一线程。
          对于可重入锁,获取了该锁的线程可以重复获取该锁,不会造成死锁。
          而不可重入锁,获取该锁的线程再获取该锁的时候,会等待对方释放,造成死锁。

四: For update原理: 

https://www.cnblogs.com/banma/p/11797560.html

五: 分布式锁:

定义: 
    分布式锁的特性是排他、避免死锁、高可用。分布式锁的实现可以通过数据库的乐观锁(通过版本号)或者悲观锁(通过for update)、
    Redis的setnx()命令、Zookeeper(在某个持久节点添加临时有序节点,判断当前节点是否是序列中最小的节点,如果不是则监听比当前节点还要小的节点。
    如果是,获取锁成功。当被监听的节点释放了锁(也就是被删除),会通知当前节点。然后当前节点再尝试获取锁,如此反复)

       Redis(自旋分布式锁): 
    Redis为单进程单线程模式,采用队列模式将并发访问的请求变成串行访问,并且多客户端对Redis的访问不存在竞争关系。

 https://blog.csdn.net/yb223731/article/details/90349502

发布了30 篇原创文章 · 获赞 15 · 访问量 2907

猜你喜欢

转载自blog.csdn.net/qq_40891009/article/details/103489525