StringBuilder线程不安全的例子
package com.xiva.demo; public class StringBuilderDemo extends Thread { private StringBuilder sb; public StringBuilderDemo(String name,StringBuilder sb) { super(name); this.sb = sb; } @Override public void run() { for (int i = 0; i < 10000; i++) { sb.append("abc"); // System.out.println(Thread.currentThread().getName()+sb.toString()); } } public static void main(String[] args) { StringBuilder sBuilder = new StringBuilder(); StringBuilderDemo mt = new StringBuilderDemo("sBuilder线程",sBuilder); // new Thread(mt).start(); mt.start(); for (int i = 0; i < 10000; i++) { sBuilder.append("abcd"); } System.out.println("main"+sBuilder.length()); // System.out.println("main"+sBuilder.toString()); } }
main所打印出的sBuilder的长度不定,也就是说mt线程执行的时候,main函数对sBuilder仍在影响,而下面的例子中,所打印出的(线程是安全的)长度是一定的!
package com.xiva.demo; public class StringBufferDemo extends Thread { private StringBuffer sBuffer; public StringBufferDemo(String name,StringBuffer sb) { super(name); this.sBuffer = sb; } @Override public void run() { for (int i = 0; i < 10000; i++) { sBuffer.append("abc"); // System.out.println(Thread.currentThread().getName()+sb.toString()); } } public static void main(String[] args) { StringBuffer sBuffer = new StringBuffer(); StringBufferDemo mt = new StringBufferDemo("sBuffer线程",sBuffer); mt.start(); // new Thread(mt).start(); // new Thread(mt).start(); for (int i = 0; i < 10000; i++) { sBuffer.append("abcd"); } while(mt.isAlive()){ } System.out.println(sBuffer.length()); } }