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 一样都是非线程安全的,每次使用都应该去获取新的对象,不能放在成员变量当中!
量变引起质变,这就是我所理解的因果。

浙公网安备 33010602011771号