想知道的话,可以自己去看JDK的代码,分析一下原因.

解决方案 »

  1.   

    回复人: flyxxxxx(灭神) ( ) 信誉:104  2005-01-14 12:29:00  得分: 0  
    多线程时,如果不同步,对同一个变量同时进行读写就可能有问题,任何方法只要没有对方法对外的变量进行赋值、重新指向另一对象(读取操作不算)等操作,它就是线程安全的。所以所有静态方法都是线程安全的。----------------------------------
    不过像Math.pow()这样的函数怎么可能不用中间变量就计算出来呢?
    我可是算的像Math.pow(3.14159265, 2.3248354);这样的运算呀。这可是特地从那里面找的最复杂的运算来测试呀。
      

  2.   

    楼上说的对,
    静态方法也得看是什么样的,如:
    public static void process(Connection con){
      //process query
      con.close();
      con = null;
    }
    不出问题才怪.
    如果你能保证你传到static里的值不改(或者你copy了一份)应该是没问题的.
      

  3.   

    跑题了,不讨论这个了。把我测试的代码贴出来,本来我认为这样的代码应该显示出错误的。
    public class TestMultithearding
    {
        public static int SIZE = 10000; 
        
        public static void main(String[] args)
        {
            TestMultithearding t = new TestMultithearding();
            TestThread[] testThread = new TestThread[SIZE];
            for (int i = 0; i < SIZE; i++)
            {
                testThread[i] = new TestThread();
            }
            
            for (int i = 0; i < SIZE; i++)
            {
            testThread[i].start();
            }
        }
    }public class TestThread extends Thread
    {
        private static double pow = 1.000;
        private double number;
        private double standard = 1.03;
        
        public TestThread()
        {
            pow = pow * 1.001;
            number = pow;
            System.out.println("number=" + number);
        }
        
        public void run()
        {
            double t = 0;
            for (int i = 0; i < 10000; i++)
            {
            t = Math.pow(standard, number);
            t = Math.pow(t, 1/number);
            if (t + 1e-9 < standard || t - 1e-9 > standard)
            {
                System.out.println("出现错误!" + "\tnumber=" + number + "\t实际计算结果=" + t);
            }
            }
        }
    }
      

  4.   

    没问题,不过有一句我觉得多余
     TestMultithearding t = new TestMultithearding();
      

  5.   

    看错了,应该是有问题的,没看到静态的pow
      

  6.   

    初步设想,应该是java虚拟机处理的。
    因为在测试的时候System.out.println()语句也没有被分来运行,可能是java虚拟机把这些语句当成基础语句,在一个时间片里运行,不会拆在两个时间片中。对这些最基本的函数来说,一次只运行一个。所以没有多线程的问题。第一次来java社区,感觉这里的人不是很多嘛。
      

  7.   

    哦,上面那段代码中:
    if (t + 1e-9 < standard || t - 1e-9 > standard)
    应改为:
    if (t * (1 + 1e-9) < standard || t * (1 - 1e-9) > standard)不好意思,出丑了。不过实际上面一行运行起来也没有问题,看来java在处理浮点型的时候方法还是挺优秀的。
      

  8.   

    Math.pow()是线程安全的但是不是说静态方法都是线程安全的,和一般方法一样也需要synchronized来同步共享资源及数据"java在处理浮点型的时候方法还是挺优秀的"
    呵呵,这给Java的脸上贴金了, Java的基本功能都是native的
      

  9.   

    线程安全,java的那些方法是线程安全的。怎么看到。在doc文档里面写得有吗?不好意思,我的E文太差了。
      

  10.   

    呵呵,这给Java的脸上贴金了, Java的基本功能都是native的--------------------
    才开始学java,对这些还是不太懂的。
      

  11.   

    本来想好好总结一下,但是发现这个问题很难讲清楚
    http://blog.csdn.net/treeroot/archive/2005/01/14/254008.aspx
      

  12.   

    楼主没有弄明白静态函数和静态变量的区别。
    静态函数只有在内部引用了静态变量的时候,才会出现多线程同步问题。
    静态函数内部创建的变量,在每个线程调用时都会另行创建,不会共用一个存储单元。
    但是对于类中的静态成员,在类加载后就占用一个存储区,每个线程访问到该静态成员时,
    都是对那个公共的存储区操作。
    下面这段代码对比一下:
    public class A{
      static String name1="";
      String name2="";
      public static String setName1(String name){
         this.name1=name;
      }
      public static String setName2(String name){
         this.name2=name;
      }
    }
    使用这2个静态方法时,setName1会出现多线程同步问题。setName2不会
      

  13.   

    Math.pow(3.14159265, 2.3248354);虽然是一个静态方法,但是他传入的参数是这两个参数(可能类似C放在stack里)
    怀疑pow就是接受这两个参数实现一定的运算 得到结果,
    这个方法并没有对同一个对象(或数据段)进行操作
    应该不存在同步问题
      

  14.   

    to wwwer1(武陵豪杰) 静态方法怎么可以访问非静态成员变量?
      

  15.   

    谢谢wwwer1(武陵豪杰),其实这个问题本来在我看的这本书前面就讲过这个问题的。可是后来被他一直绕,一直绕,绕到后来就记得有多线程的危险了,忘了要静态变量了。唉,太失败了…………
      

  16.   

    to:treeroot
    说的好。我写错了,静态方法只能访问类的静态成员。
    访问非静态成员必须有一个类的实例。哎,失败&羞愧