A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李江 于 2013-10-20 18:25 编辑

最好能有代码说明

4 个回复

倒序浏览
transient

transient是一个变量修饰符,标记为transient的变量,在对一个对象进行序列化时,这些变量状态不会被序列化。

例如,假设某个类的成员变量是transient,那么当通过ObjectOutputStream把这个类的某个实例保存到磁盘上时,实际上transient变量的值是不会保存的。

当对象序列化的保存在存储器上时,不希望有些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。

要更明白,可以看一些序列化的内容。

volatile
原CSDN有一篇介绍过,现贴回来。

volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
看看Java Language Specification中的例子。
条件:一个线程不停的调用方法one(),一个线程不停的调用方法two()。我测试过多次,这种情况好像一直没有出现。

代码
class Test {
static int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}

结果偶尔会出现j大于i的情况,因为方法没有同步,所以会出现i和j可能不是一次更新。一种防止这种情况发生的办法就是声明两个方法为synchronized 的。

代码
class Test {
static int i = 0, j = 0;
static synchronized void one() { i++; j++; }
static synchronized void two() {
System.out.println("i=" + i + " j=" + j);
}
}

这样可以防止两个方法同时被执行,还可以保证j和i被同时更新,这样一来i和j的值一直是一样的。
另外一种途径就是把i和j声明为volatile。

代码
class Test {
static volatile int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}

strictfp  
修饰类和方法,意思是FP-strict,精确浮点,符合IEEE-754规范的。当一个class或interface用strictfp声明,内部所有的float和double表达式都会成为strictfp的。Interface method不能被声明为strictfp的,class的可以。
Example:  

代码
strictfp interface FPTest {     
     void methodA();     
}     
class FPClass implements FPTest {     
    public void methodA() {   
    }     
    public void methodB() {     
  }     
  public strictfp void methodC() {     
  }     
}     
class FPClassB {     
    strictfp void methodA() {     
    }     
}     

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
strictfp
修饰类和方法,意思是FP-strict,精确浮点,符合IEEE-754规范的。当一个class或interface用strictfp声明,内部所有的float和double表达式都会成为strictfp的。Interface method不能被声明为strictfp的 class的可以
代码:
  1. strictfp interface FPTest {   
  2.      void methodA();   
  3. }   
  4. class FPClass implements FPTest {   
  5.     public void methodA() {   
  6.     }   
  7.     public void methodB() {   
  8.   }   
  9.   public strictfp void methodC() {   
  10.   }   
  11. }   
  12. class FPClassB {   
  13.     strictfp void methodA() {   
  14.     }   
  15. }  

  16. strictfp interface FPTest {
  17.      void methodA();
  18. }
  19. class FPClass implements FPTest {
  20.     public void methodA() {
  21.     }
  22.     public void methodB() {
  23.   }
  24.   public strictfp void methodC() {
  25.   }
  26. }
  27. class FPClassB {
  28.     strictfp void methodA() {
  29.     }
  30. }
复制代码
transient
变量修饰符。标记为transient的变量,在对象存储时,这些变量状态不会被持久化。当对象序列化的保存在存储器上时,不希望有些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。
volatile
volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值
看看Java Language Specification中的例子。
条件:一个线程不停的调用方法one(),一个线程不停的调用方法two()。我测试过多次,这种情况好像一直没有出现。
代码
  1. class Test {
  2.         static int i = 0, j = 0;
  3.         static void one() { i++; j++; }
  4.         static void two() {
  5.                 System.out.println("i=" + i + " j=" + j);
  6.         }
  7. }
复制代码
结果偶尔会出现j大于i的情况,因为方法没有同步,所以会出现i和j可能不是一次更新。一种防止这种情况发生的办法就是声明两个方法为synchronized 的。
  1. class Test {
  2.         static int i = 0, j = 0;
  3.         static synchronized void one() { i++; j++; }
  4.         static synchronized void two() {
  5.                 System.out.println("i=" + i + " j=" + j);
  6.         }
  7. }
复制代码
这样可以防止两个方法同时被执行,还可以保证j和i被同时更新,这样一来i和j的值一直是一样的。
另外一种途径就是把i和j声明为volatile。
  1. class Test {
  2.         static volatile int i = 0, j = 0;
  3.         static void one() { i++; j++; }
  4.         static void two() {
  5.                 System.out.println("i=" + i + " j=" + j);
  6.         }
  7. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
hmwudizl91zl 发表于 2013-10-20 10:06
transient

transient是一个变量修饰符,标记为transient的变量,在对一个对象进行序列化时,这些变量状态不 ...

感谢你的回答
回复 使用道具 举报
Simple_love 发表于 2013-10-20 10:08
strictfp
修饰类和方法,意思是FP-strict,精确浮点,符合IEEE-754规范的。当一个class或interface用stric ...

问题解决了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马