日期:2014-05-20  浏览次数:20620 次

如何从API文档中知道方法是否synchronized
看一些资料,比如:说到Stack类时,有方法:
public   synchronized   Object   pop()
public   synchronized   Object   peek()
public   synchronized   int   search(Object   o)
(参见http://blog.csdn.net/treeroot/archive/2004/09/18/109068.aspx)
但我查了JDK   的API文档,没有有关synchronized的修饰,后来查了网上,说到从javadoc   1.2开始:
从签名中删除“synchronized”和“native”。Javadoc   生成   API   规范。这两个关键字不属于规范的签名,因为它们与实现相关。无需生成关键字“native”的文档。关键字“synchronized”指示对线程安全的行为,应该在方法描述中进行描述。对线程安全的方法本身可能不使用关键字   "synchronized ",但可能调用   private   方法。  
旧行为:Javadoc   1.1   包括关键字“synchronized”和“native”。  
(参见http://www.iplab.cs.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/javadoc/whatsnew.html)
但问题是我查了Stack,里面没有看到任何有关synchronized的描述和说明。我的问题是:
1)Stack的一系列方法是否synchronized方法
2)在使用一个新的类方法时,大家是如何从API文档中判断它是否synchronized?
谢谢!


------解决方案--------------------
这个应该跟你在实际应用中,是否需要同步有关吧?
------解决方案--------------------
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Stack;

public class Test() {
  public static void main(String[] args) {
    Method[] ms = java.util.Stack.class.getDeclaredMethods();
    System.out.printf( "Class: %s%n ", Stack.class.getName());
    System.out.printf( "%-15s%-15s%-15s%n ", "method name ", "synchronized? ", "navtive? ");
    System.out.println( "---------------------------------------- ");
    for(Method m:ms){
      System.out.printf( "%-15s%-15s%-15s%n ",
          m.getName(),
          Modifier.isSynchronized(m.getModifiers()),
          Modifier.isNative(m.getModifiers()));
    }
  }
}

试试看以上的代码吧,另外,Method中有个toGenericString()可以看到该方法的原型。

另外,API中好像看不出方法的synchronized修饰的。
------解决方案--------------------
package com.reflect;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
* @author fmj
*
*/
public class IsSynchronized {
public static void main(String[] args) {

final String CLASS_NAME = "java.util.Stack ";
try {
Class c = Class.forName(CLASS_NAME);
Method[] ms = c.getDeclaredMethods();

System.out.printf( "Class: %s%n ", c.getName());
System.out.printf( "%-15s%-15s%-15s%n ", "method name ",
"synchronized? ", "navtive? ");
System.out.println( "---------------------------------------- ");
for (Method m : ms) {
System.out.printf( "%-15s%-15s%-15s%n ", m.getName(), Modifier
.isSynchronized(m.getModifiers()), Modifier.isNative(m
.getModifiers()));
}
} catch (Exception e) {
System.out.println( "Exception!!! ");
}

}
}
------解决方案--------------------
汗,打开源代码看看吧