老早就听说String不是线程安全的,而StringBuffer是线程安全的,今天突然想起了,很想写个测试程序验证一下,但未能写出(写出来但未能体现不安全),特求此程序!希望牛们能给我一个完整的测试程序,谢谢!

解决方案 »

  1.   

    你这个问题都不对的吧,String,StringBuffer,StringBuilder,
      

  2.   

    我认为线程安全主要是针对那些需要维护内部状态改变的类。
    而java的String 是不可变的,他的所有操作都不会对他的状态进行修改,有的操作是重新创建一个String对象,所以我觉得 说String是否线程安全不合适 
      

  3.   

    String不是线程安全的?String是个final类,对于线程的设计模式来说就是Immutable模式,所以是不可能线程不安全的。
      

  4.   

    我想lz应该是问关于StringBuffer和StringBuilder的问题吧
    StringBuffer类是安全的,一般用于多线程。而StringBuilder类则不确定安全...,一般用于单线程,sun公司把这个StringBuilder加进来主要是考虑到多线程牺牲了性能,故提供一个StringBuilder提高效率是用的
      

  5.   

    为了能够在复制字符串里,获得较高的性能,所以,一般的string都用了引用计数实现。但是,对于多线程来说,引用计数就是一个全局变量。所以,如果在实现过程中,如果没有考虑多线程,那么在多线程间共享string就会出问题的。
      

  6.   

    String是不可变的,所以所有String的方法返回值应该都是固定的。这样不会有线程问题的。其实你是想比较StringBuffer和StringBuilder吧?不需要怎么比较,看看他们代码就知道啦,StringBuffer的方法带有synchronized     public synchronized StringBuffer append(Object obj) {
    super.append(String.valueOf(obj));
            return this;
        }StringBuilder的方法是不带synchronized的。
        public StringBuilder append(Object obj) {
    return append(String.valueOf(obj));
        }    public StringBuilder append(String str) {
    super.append(str);
            return this;
        }
      

  7.   

    答:我想对楼主说:你要求的代码是不存在的。
    请楼主记住:所有的Immutable对象(即:状态不能改变的对象)是线程安全的。因此:除了String的对象外,其它的如:Integer类的对象,BigDecimal类的对象,BigInteger类的对象等都是Immutable对象,都是线程安全的。
      

  8.   

    同意6楼的观点
    这些程序是书本上的,是多线程模式中的Single Thread Execution,不过不是关于String不安全的。
    自己看看下面的程序,
    public class UserThread extends Thread {
    private final Gate gate;
    private final String myname;
    private final String myaddress;
    public UserThread(Gate gate,String myname,String myaddress)
    {
    this.gate=gate;
    this.myname=myname;
    this.myaddress=myaddress;
    }
    public void run()
    {
     System.out.println(myname+"BEGIN");
     while(true)
     {
     gate.pass(myname,myaddress);
     }
    }
    }安全的线程,不安全的已注释
    public class Gate
    {
    private int counter=0;
    private String name="nobody";
    private String address="nowhere";
    public synchronized void pass(String name,String address)
    //public void pass(String name,String address)
    {
    this.counter++;
    this.name=name;
    this.address=address;
    check();
    }
    public synchronized String toString()
    //public String toString()
    {
    return "No"+counter+":"+name+","+address;
    }
    private void  check()
    {
    if(name.charAt(0)!=address.charAt(0))
    {
    System.out.println("**** BROKEN****"+toString());
    }
    }
    }
    测试程序如下:
    public class Main {
      public static void main(String [] agrs)
      {
      System.out.println("testing gate,press CTRL+C to stop");
      Gate gate=new Gate();
      new UserThread(gate,"alice","alssk").start();
      new UserThread(gate,"bob","braiz").start();
      new UserThread(gate,"cici","china").start();
      }}
      

  9.   


    顶,这个才是正解, immutable对象不存在线程安全问题, 你无法改写其对象, 所以,不会存在读写冲突。
      

  10.   

    楼主的问题真的很屌啊。
    String的对象,本身是线程安全的啊。
    11楼说的没错,哈哈。StringBuilder不是线程安全的,而且他和StringBuffer所实现的接口都相同,
    所以,可以通过同一个套方法进行类比测试。
      

  11.   

    再帮LZ补充一下, 关于线程安全, 可以看看《Effective java》中第五十二条, 线程安全性得文档化,其中讲述了“线程安全”是分级别的,不是存在Synchronize就是安全了: 具体有:1. immutable, 这个是排在第一, 表明变成无需对其进行同步2. thread-safe, 类可变, 但方法Synchronize了, 所以无需同步3. conditionly thread-safe。有兴趣可以看看, 帮助理解同步, 因为这个问题跟身边的朋友讨论时,也产生了较大争议,这个可能对你有帮助。