package mutilThreadDemo; import org.junit.Test; /** * Created by damon on 2017/10/17. * 共享变量的线程不安全 * Integer 属于不可变对象,你每次修改 count 的值,其实 count 的引用都已经被改变了。你可以自己模拟一个内部值的可变的 Integer 对象: */ public class App2 { public static void main( String[] args ) throws Exception { System.out.println("虚拟机内核数:"+Runtime.getRuntime().availableProcessors()); Runnable r = new Runnable() { Integer count = 500; @Override public void run() { threadRun(count); } }; Thread ct1 = new Thread(r,"子线程1号"); Thread ct2 = new Thread(r,"子线程2号"); Thread ct3 = new Thread(r,"子线程3号"); Thread ct4 = new Thread(r,"子线程4号"); Thread ct5 = new Thread(r,"子线程5号"); Thread ct6 = new Thread(r,"子线程6号"); Thread ct7 = new Thread(r,"子线程7号"); Thread ct8 = new Thread(r,"子线程8号"); Thread ct9 = new Thread(r,"子线程9号"); ct1.start(); ct2.start(); ct3.start(); ct4.start(); ct5.start(); ct6.start(); ct7.start(); ct8.start(); ct9.start(); } /* * synchronized 无效问题? * */ synchronized private static void threadRun( Integer count){ try { count++; System.out.println(Thread.currentThread().getName() + "--计算count,计算后值为:" + count); }catch (Exception e){} } /** * 同步处理 */ @Test public void syncVar()throws Exception{ System.out.println("虚拟机内核数:"+Runtime.getRuntime().availableProcessors()); Runnable r = new Thread() { private int count = 100; @Override synchronized public void run() { try { count--; System.out.println(Thread.currentThread().getName() + "--计算count,计算后值为:" + count); }catch (Exception e){} } }; Thread ct1 = new Thread(r,"子线程1号"); Thread ct2 = new Thread(r,"子线程2号"); Thread ct3 = new Thread(r,"子线程3号"); Thread ct4 = new Thread(r,"子线程4号"); Thread ct5 = new Thread(r,"子线程5号"); Thread ct6 = new Thread(r,"子线程6号"); Thread ct7 = new Thread(r,"子线程7号"); Thread ct8 = new Thread(r,"子线程8号"); Thread ct9 = new Thread(r,"子线程9号"); ct1.start(); ct2.start(); ct3.start(); ct4.start(); ct5.start(); ct6.start(); ct7.start(); ct8.start(); ct9.start(); Thread.sleep(5000); } @Test public void notAlterVar() throws Exception { System.out.println("虚拟机内核数:" + Runtime.getRuntime().availableProcessors()); Runnable r = new Runnable() { MutableInt count = new MutableInt(100); @Override public void run() { threadRun(count); } }; Thread ct1 = new Thread(r, "子线程1号"); Thread ct2 = new Thread(r, "子线程2号"); Thread ct3 = new Thread(r, "子线程3号"); Thread ct4 = new Thread(r, "子线程4号"); Thread ct5 = new Thread(r, "子线程5号"); Thread ct6 = new Thread(r, "子线程6号"); Thread ct7 = new Thread(r, "子线程7号"); Thread ct8 = new Thread(r, "子线程8号"); Thread ct9 = new Thread(r, "子线程9号"); ct1.start(); ct2.start(); ct3.start(); ct4.start(); ct5.start(); ct6.start(); ct7.start(); ct8.start(); ct9.start(); } /* * synchronized 无效问题? */ synchronized private static void threadRun(MutableInt count) { try { count.inc(); System.out.println(Thread.currentThread().getName() + "--计算count,计算后值为:" + count); } catch (Exception e) { } } } class MutableInt { private int value; public MutableInt(int initial) { value = initial; } public int get() { return value; } public String toString() { return String.valueOf(value); } public void inc() { value++; } }