(2.1.16)java关键字assert、volatitle、instanceof、strictfp

  • 1-Java中的assert使用
    • 1-assert的使用
    • 2-Java中assertion与C中的assertion的区别在
  • 2-Volatile
    • 1-定义
    • Volatile VS Synchronized
  • 3-instanceof
    • 1-定义
    • 2-示例
  • 4-strictfp 即 strict float point 精确浮点

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:

  1. Volatile 是字段修饰符,Sync是方法和代码块的修饰符.
  2. 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.

你可能感兴趣的:((2.1.16)java关键字assert、volatitle、instanceof、strictfp)