1-Java中的assert使用
1.1-assert的使用
1)assert exp1 此时的exp1为一个boolean类型的表达式
当其值为true时,运行通过,如果为false,则会抛出一个相应的AssertionError,注意它可以被catch,也可以不去处理
2)assert exp1 : exp2 此时的exp1同上,而exp2可以为基本类型或一个Object
当exp1的值为true时,同上,且exp2不会被运算;而当exp1的值为false时,将会抛出AssertionError,同时将exp2的结果作为AssertionError构造器中的参数,当使用catch该错误时,可利用getMessage()方法打印出exp2的结果。
[c-sharp] view plaincopy
public class AssertTest2 {
public void assertMe(boolean foo) {
String str = null;
assert foo?true:false : str = "Error Occur!";
System.out.println("in true condition");
}
public static void main(String[] args) {
AssertTest2 at = new AssertTest2();
try {
at.assertMe(true);
at.assertMe(false);
} catch(AssertionError ae) {
System.out.println(ae.getMessage());
}
}
}
运行后结果:
in true condition
Error Occur!
1.2-Java中assertion与C中的assertion的区别在
1)Java中是使用assert关键字去实现其功能,而C中是使用的类库函数;
2)C中的assertion是在编译时开启,Java中则是在运行时才开启
2-Volatile
2.1-定义
在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。
Volatile 比同步更简单,只适合于控制对基本变量(整数、布尔变量等)的单个实例的访问。
当一个变量被声明成 volatile,任何对该变量的写操作都会绕过高速缓存,直接写入主内存,而任何对该变量的读取也都绕过高速缓存,直接取自主内存。这表示所有线程在任何时候看到的 volatile 变量值都相同。
public class StoppableTask extends Thread {
private volatile boolean pleaseStop;
public void run() {
while (!pleaseStop) {
// do some stuff...
}
}
public void tellMeToStop() {
pleaseStop = true;
}
}
Volatile VS Synchronized:
- Volatile 是字段修饰符,Sync是方法和代码块的修饰符.
- Volatile限制的变量不允许提取到各个线程的工作内存中进行操作,而若是某个变量被Sync限制的某段代码圈住,则系统会时刻保持主存与工作内存中的变量值一致.
3.Volatile是轻量级的同步,开销不是很大,Sync是高开销的同步,Just keep in mind that synchronizing a method can decrease performance by a factor of 100.
3-instanceof
3.1-定义
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
3.2-示例
if(a instanceof String)
cout<<"a不是字符串类型";
4-strictfp, 即 strict float point (精确浮点)
strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。当对一个类或接口使用 strictfp 关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。
如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp.