用于多线程下的StringBuffer和StringBuilder的状态
来源:互联网 发布:java extends 编辑:程序博客网 时间:2024/06/01 07:40
package org.donkey.app.StringBufferAndStringBuilder;import java.util.concurrent.CountDownLatch;/** * Created with IntelliJ IDEA. * User: Donkey * Date: 13-11-24 * Time: 上午11:28 * 用于多线程下的StringBuffer和StringBuilder的状态, * 其实有人说StringBuffrer是线程安全的而StringBuilder是线程不安全的,这种说法是错误的 * 这中线程安全是相对的,在StringBuffer中大部分方法都加上了synchronized关键字,使得同一时刻,不会两个线程 * 同时访问该方法,但在一个线程不安去的环境下用StringBuffer去工作,得到的结果也不一定和预期的一样,就如同本例。 * 它们的本质的区别在于:StringBuffer的结果与预期不一样是因为逻辑代码的问题,不存在多个线程同时访问而产生未知的 * 数据问题。而StringBuilder是有可能在同一时刻被多个线程所访问而产生线程同步问题 */public class StringBufferAndStringBuilder { public static void main(String[] args){ long startTime = System.currentTimeMillis(); StringBuffer sb = new StringBuffer(); StringBuilder sbd = new StringBuilder(); int threadNum = 1000; //线程数 //定义正在运行的线程数 CountDownLatch runningThreadNum = new CountDownLatch(threadNum); System.out.println(Thread.currentThread().getName()+"-start"); //创建多个子线程 for(int i = 0; i < threadNum; i++){ new ThreadTest(sb, runningThreadNum).start(); } //等待子线程都执行完了再执行主线程剩下的动作 try { runningThreadNum.await(); System.out.println(sb.toString()); System.out.println(Thread.currentThread().getName()+"-end"); long endTime = System.currentTimeMillis(); System.out.println("runningTime:"+(endTime-startTime)); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } }}class ThreadTest extends Thread{ private StringBuffer sbd; //子线程记数器,记载着运行的线程数 private CountDownLatch runningThreadNum; public ThreadTest(StringBuffer sbd, CountDownLatch runningThreadNum){ super(); this.sbd = sbd; this.runningThreadNum = runningThreadNum; } @Override public void run(){ System.out.println(Thread.currentThread().getName()+"-start"); for (int i = 0; i < 10; i++){ if(i == 5){ try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } sbd.append(i); } System.out.println(Thread.currentThread().getName()+"-end"); runningThreadNum.countDown(); }}