本帖最后由 tiancaixuchao2009 于 2013-08-22 20:41:21 编辑

解决方案 »

  1.   

    http://hi.baidu.com/gabe2008/item/0ee7dca8d006fd776cd455d0
      

  2.   

    package cn.dzr.thread;import org.omg.PortableInterceptor.CurrentHelper;class DelStr implements Runnable
    { StringBuilder sb;
    DelStr(StringBuilder sb)
    {
    this.sb = sb;
    }
    public void run()
    {
    for(int i =0;i<sb.length();)
    {


    try
    {
    Thread.sleep(10);
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    sb.deleteCharAt(i);

    }
    }
    }
    public class StringBuilderTest
    {
    public static void main(String[] args)
    {
    StringBuilder sb = new StringBuilder("abcdefgh");
    new Thread(new DelStr(sb)).start();
    new Thread(new DelStr(sb)).start();


    }
    }
      

  3.   

    楼上这个代码用stringbuffer在删除最后一个点是会出现越界报错
      

  4.   

    楼上这个代码用stringbuffer在删除最后一个点是会出现越界报错
    越界的原因是什么呢?
    多线程的缘故,不过我感觉这个例子似乎并不能说明线程安全和不安全,
    附一个我的例子吧,public class Test3 implements Runnable {
    //    StringBuilder builder = new StringBuilder();
        StringBuffer buffer=new StringBuffer();
        public void run() {
            try {
                Thread.sleep((int)(Math.random() * 2));
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
    //      builder.append(1);
            buffer.append(1);
        }    public static void main(String[] args) throws InterruptedException {
            ThreadGroup group = new ThreadGroup("testgroup");
            Test3 t = new Test3();
            for (int i = 0; i < 100000; i++) {
                Thread th = new Thread(group, t, String.valueOf(i));
                th.start();
            }
           
            while (group.activeCount() > 0) {
                Thread.sleep(10);
            }
         // 如果长度为100000就是安全的
    //      System.out.println(t.builder.length()); 
            System.out.println(t.buffer.length());
        }
    }
      

  5.   

    public class Test {
        public static void main(String[] args) {
            StringBuffer sbf = new StringBuffer();
            StringBuilder sb = new StringBuilder();
            //10个线程
            for (int i = 0; i < 10; i++) {
                new Thread(new TestThread(sbf, sb)).start();
            }
        }
    }class TestThread implements Runnable {
        StringBuffer sbf;
        StringBuilder sb;    TestThread(StringBuffer sbf, StringBuilder sb) {
            this.sb = sb;
            this.sbf = sbf;
        }    @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                sb.append("1");
                sbf.append("1");
                System.out.println(sb.length() + "/" + sbf.length());
            }
        }
    }