直接上代码: 1.StringBuffer
package com.thread; import javax.annotation.concurrent.ThreadSafe; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; @ThreadSafe public class SafeCountExample { //请求总数 private static int clientTotal = 5000; //线程数量 private static int threadTotal = 200; private static StringBuffer stringBuffer = new StringBuffer(); //private static StringBuilder stringBuilder = new StringBuilder(); public static void main(String[] args) throws Exception{ ExecutorService exec = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(threadTotal); //每次固定数量的线程获取许可 final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); for (int i = 0; i < clientTotal ; i++) { exec.execute(()->{ try { semaphore.acquire(); add(); semaphore.release(); }catch (Exception e){ e.printStackTrace(); } countDownLatch.countDown(); }); } countDownLatch.await(); exec.shutdown(); System.out.println(stringBuffer.length()); // System.out.println(stringBuilder .length()); } private static void add(){ stringBuffer.append("1"); // stringBuilder .append("1"); } }
1.1 多次运行,发现是线程安全的,结果都一样如下,:
2.StringBuilder.我们放开红色被注释的代码,多次运行,发现线程是不安全的,结果都不一样: