java中常见问题归集

一、Java中为何要在try{}语句外Lock锁?

遵循最小化try-catch范围的原则

    查看文档可知

    void lock();

    lock方法是没有指定抛出的异常的,所以不应当包含到try-catch块中。

    unlock放到finally中也是为了保证业务无论异常与否,最终都要解除锁,释放资源避免死锁。

②代码逻辑决定
    在try-finally外加锁,如果因为异常导致加锁失败,try-finally块中的代码不会执行。相反,如果在try{}代码块中加锁失败,finally中的代码无论如何都会执行,但是由于当前线程加锁失败并没有持有lock对象锁 ,所以程序会抛出异常。
1 Lock lock = ...;
2 lock.lock();
3 try{
4     //处理任务
5 }catch(Exception ex){
6 
7 }finally{
8     lock.unlock();   //释放锁
9 }

 

二、ReentrantReadWriteLock设计的细节

  ReentrantReadWriteLock 实现了 ReadWriteLock 接口( 注意,ReentrantReadWriteLock 并没有实现 Lock 接口 ),其包含两个很重要的方法:readLock() 和 writeLock() 分别用来获取内部类读锁和写锁,并且这两个锁实现了Lock接口。

  体会这样设计的妙处:

        读写锁ReentrantReadWriteLock更强调的是获取读写锁的功能,所以实现ReadWriteLock接口,而不管是读锁还是写锁,都是🔒,要具备锁的功能,所以实现Lock接口。一句话:彼此的侧重点不同。

 

三、关于浮点数

public final class Float extends Number implements Comparable<Float> {
    /**
     * A constant holding the positive infinity of type
     * {@code float}. It is equal to the value returned by
     * {@code Float.intBitsToFloat(0x7f800000)}.
     */
    public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

    /**
     * A constant holding the negative infinity of type
     * {@code float}. It is equal to the value returned by
     * {@code Float.intBitsToFloat(0xff800000)}.
     */
    public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

    /**
     * A constant holding a Not-a-Number (NaN) value of type
     * {@code float}.  It is equivalent to the value returned by
     * {@code Float.intBitsToFloat(0x7fc00000)}.
     */
    public static final float NaN = 0.0f / 0.0f;

①十进制无法用一个数表示1/3,同样,二进制系统中无法准确的表示1/10

②在使用浮点数时关于精度损失需要考虑的点:浮点数在存储时如①所示本身造成的精度损失、二进制和十进制转化的过程中造成的精度损失

③计算机中浮点是不能表示0值,浮点数的0.0表达一个无限接近0的数(科学计数法为指数函数所决定

 

 1数以一个无限接近0的数,得到一个无穷大的数 POSITIVE_INFINITY

0.0/0.0  两个无穷大的数相除可能为1、2、3。。。是一个未知的数 NaN

在数学中,可以使用科学计数法表示一个极大或者极小且数位比较多的数,科学计数法可以唯一的表示任何一个数,且所占用的存储空间更小,这是二进制存储世界的福音

 

四、SqlSession 和 Connect 一样都是非线程安全的,每次使用都应该去获取新的对象,不能放在成员变量当中!

posted @ 2020-04-09 08:16  TomDu  阅读(141)  评论(0)    收藏  举报