} } } 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();
} }
楼上这个代码用stringbuffer在删除最后一个点是会出现越界报错
楼上这个代码用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(); }
{ 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();
}
}
越界的原因是什么呢?
多线程的缘故,不过我感觉这个例子似乎并不能说明线程安全和不安全,
附一个我的例子吧,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());
}
}
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());
}
}
}