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

来源:互联网 发布:淘宝车牌摇号骗局 编辑:程序博客网 时间:2024/05/22 12:10

  • 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 plaincopypublic 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 conditionError 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.

0 0