class aaaa
{
    private String ii;
     public void xyz()
    {
       .........这里面操作ii
     }    public void abc()
    {
      private String jj;
      ..................这里面操作jj
     }
    public static String mn(String kk)
   {
     ................这里操作kk
     return kk;
    }
}就像上面的类。都是非静态的方法,这样的操作每个用户调用的时候都会new一下。那么我是这样认为的,xyz方法是线程不安全的。abc方法是线程安全的。mn是线程不安全的。不知道对不对。
我有下面的问题:
一、每个用户执行xyz的时候都会先new一下。那么这时就会分配一个新的内存给此用户。那么每个用户操作的ii都不会是同一个内存里的对象。怎么会引起线程不安全呢?
二、方法abc是绝对线程安全的吗?
三、mn是个静态方法,操作的是同一个内存,那么如果并发的时候,会出现线程安全的问题。可是我看了很多介绍,说是静态方法如果不调用静态的成员,就不会是线程安全的。
所以我乱了。自己的想法也不太肯定了。特来问问。谢谢了。

解决方案 »

  1.   

    一、每个用户执行xyz的时候都会先new一下。那么这时就会分配一个新的内存给此用户。那么每个用户操作的ii都不会是同一个内存里的对象。怎么会引起线程不安全呢?
    二、方法abc是绝对线程安全的吗?
    三、mn是个静态方法,操作的是同一个内存,那么如果并发的时候,会出现线程安全的问题。可是我看了很多介绍,说是静态方法如果不调用静态的成员,就不会是线程安全的。
    所以我乱了。自己的想法也不太肯定了。特来问问。谢谢了。
    //
    1:调用xyz不一定要new一下, aaaa a = new aaaa();
                           aaaa b = a;
                           a.xyz();           
                           b.xyz();
        这样可以吧,所以xyz是线程危险的        
    2. 如果方法操作局部变量,是线程安全的
    3. 第三种说法,你表达的意思不是很明确
      

  2.   

    都是非静态的方法,这样的操作每个用户调用的时候都会new一下.
    --------------------------------------------------------------
    回复:明明有一个public static String mn(String kk),调用这个函数不用new。ClassA aa = new ClassA();
    ClassA bb = new ClassA();
    aa 和 bb 是不同的,在内存中所占的空间亦不相同,不会引起“线程不安全”一、每个用户执行xyz的时候都会先new一下。那么这时就会分配一个新的内存给此用户。那么每个用户操作的ii都不会是同一个内存里的对象。怎么会引起线程不安全呢?
    --------------------------------------------------------------
    回复:你的线程不安全是由同时调用同一个对象实例的xyz()方法引起,而不是调用不同实例引起。二、方法abc是绝对线程安全的吗?
    --------------------------------------------------------------
    是安全的。--我认为,没有充足理由。每次调用abc(),里面的jj(注,这个变量名真别扭)都会被初始化。三、mn是个静态方法,操作的是同一个内存,那么如果并发的时候,会出现线程安全的问题。可是我看了很多介绍,说是静态方法如果不调用静态的成员,就不会是线程安全的。
    --------------------------------------------------------------
    这不矛盾,只要静态方法不去操作成员变量,是不会引起的。
    你有两个概念没有搞清楚,一个是“static”的用法,另一个是你说讲的“线程安全”。线程安全主要是由同时调用非synchronized方法来操作类的成员变量引起的。上述言论,未经严谨测试,错误之处海涵。
      

  3.   

    线程安全主要是由同时调用非synchronized方法来操作类的成员变量引起的。
    ????那么,同时调用非synchronized方法一定会引起线程安全的问题吗?
      

  4.   

    有谁对这个问题感兴趣。可以看看.NET社区里的讨论。Java版人气不好。http://community.csdn.net/Expert/topic/4648/4648473.xml?temp=.7312891
      

  5.   

    呵呵,string是不变类,怎么会线程不安全?
    如果string只是个符号,可以代表其他类型的话,那么三个方法都没有同步,又如何线程安全?
      

  6.   

    每次调用abc(),这里面操作jj(注,这个变量名真别扭)
    哈哈!!同意:PoemCode(诗意代码之魔数) 
      

  7.   

    我没学过.net,不知道.net里面的线性安全是什么意思,不过我学过Delphi,Delphi里面的线性安全的定义和Java是一样的,就是同一个方法同一时间内,只有一个线程能调用,在java中,如果把一个类的属性变量设为private的,然后这些变量都用setXXX和getXXX方法来存取,只要把这些setXXX,和getXXX方法用synchronize来修饰,那些这些属性变量也变成线性安全的了。性线安全的最重要的目的就是为了一些变量不会因为多个线程对他们进行存取造成混乱,由此,我个人武断,楼主是不是理解错了JAVA中线性安全的定义?一、每个用户执行xyz的时候都会先new一下。那么这时就会分配一个新的内存给此用户。那么每个用户操作的ii都不会是同一个内存里的对象。怎么会引起线程不安全呢?
    答:每次都new,的确不会存在线性安全的问题,但是java常见的作法,是把一个类的引用,作为参数传到另外一个类的方法中的,这样,其实多个线程都是引用同一内存地址中的某个类的,这样就会造成线程不安全,所以要把这些方法用synchronize修饰,那么这个方法同一时间内只能被一个线程调用。二、方法abc是绝对线程安全的吗?
    答:不是,原因同上。三、mn是个静态方法,操作的是同一个内存,那么如果并发的时候,会出现线程安全的问题。可是我看了很多介绍,说是静态方法如果不调用静态的成员,就不会是线程安全的。
    答:静态方法也有可能不是线性安全的,静态方法操作的变量,也是存在于某一内存地址中的,多个线程同一时间对这个内存地址进行存取,就不安全了。
      

  8.   

    同意:PoemCode(诗意代码之魔数)