本帖最后由 didengxiaren 于 2010-07-23 15:04:15 编辑

解决方案 »

  1.   


        public static synchronized void m(String threadName){
            for(int i=0;i<10;i++){
                System.out.println(threadName+":"+i);
            }
        }
    上面这个静态方法的static修饰符是不起作用的,静态方法不存在线程访问冲突,只有静态方法中的公共变量才会有这个问题:
    函数方法只是一段计算机指令而已,多线程运行的那个静态方法的代码在内存中就一块,只是堆栈和寄存器中的内容(数据)不一样而已。同步需要同步的是全局变量,并非是代码。
      

  2.   

    synchronized 对静态方法的修饰和对非静态方法的修饰是同样的作用吧。都是用于线程同步。
    只是静态方法可以通过类名调用,而非静态方法必须构建新对象后再调用。
      

  3.   

    synchronized修饰静态方法,相当于对方法所在类的class进行同步public static synchronized void m(String threadName){
        for(int i=0;i<10;i++){
            System.out.println(threadName+":"+i);
        }
    }
    相当于
    public static void m(String threadName){
        synchronized(TestStaticMethod.class){
            for(int i=0;i<10;i++){
                System.out.println(threadName+":"+i);
            }
        }
    }
      

  4.   

    任何 Object 都有一个隐含锁,非static方法是属于 对象实例 object的,同步时使用 对象实例 object的隐含锁而static方法属于Class 类对象,static 方法同步是使用的 Class对象的隐含锁。楼上 redduke1202 说的正解