对于Java中的构造函数,它是默认互斥的,所以我们不需要加锁。
并不是某一行语句就算一个原子操作,原子操作由JVM决定。但是程序员可以通过加锁的方法设置原子操作。
线程休眠sleep()方法不会释放锁,仍然保持同步控制,而wait()方法会让出资源,释放锁。
对于interrupt()方法,并不是强制中断线程的,而是由线程自己觉得中断不中断。
我们可以用isInterrupted()或者Interrupted()方法来判断线程是否中断,要注意的是Interrupted()方法会复位中断标识符。
创建线程有两种方法,一种是通过Thread类继承来派生子类,只需要重写run方法,然后start()即可。另一种是通过Runnable接口来创建Thread对象,也是重写run方法,然后start(),要注意的是调用的是thread类中的start()方法而不是run()方法。
路径覆盖>分支覆盖>语句覆盖
对于Java中的设计模式
1.访问者模式,这是Java中唯一一种双向委托的模式,即在ADT中预留一个accept visitor类的接口,由子类来实现这个方法,这个方法的参数为visitor,然后在这个方法中使用委托调用visitor类的visitor方法,在visitor类中可以使用多态来visit不同的”商品“。
2.迭代器模式,是委托到外部的iteratro对象来进行迭代的。或者说我们可以在类的内部实现一个迭代器。
判断两个对象相等需要从AF和Observer方法两个角度说明。
list使用set方法之前需要先初始化该位置的元素,也就是该位置必须先有元素吗,否则list.set(i,x)就会报错。
对于重写,Java是在运行时判断调用父类的方法还是子类的方法的,而对于重载则是编译阶段。
对于正则表达式,\s表示空白符,包括空格,换行和回车。\也可以表示转义,表示\之后的字符。^表示除了之后的字符的所有字符。对于量词,要区别?和*和+,?表示0个或者1个,*表示0个或者多个,而+表示1个或者多个。另外在正则表达式中,一元符号优先级是大于二元符号的,所以abc+并不表示多个abc,而是表示一个ab,后面跟着多个c,这点需要注意。
对于线程安全来说,即使我们获得了线程安全的集合类,例如使用collections.synchronizedList()获得了线程安全的list,也不代表在多个线程的多个操作中就一定线程安全。