• JAVA i++线程非安全测试1


    1.i++ 线程非安全测试

    package com.jdbc.test;
    
    import java.util.concurrent.CountDownLatch;
    
    public class Main {
    	
    	private int i;
    	public int getI() {
    		return i;
    	}
    	public void setI(int i) {
    		this.i = i;
    	}
    	public  void incr(){
    		i++;
    	}
    	public static void main(String[] args) throws InterruptedException {
    		
    		for(int j=0;j<10;j++){
    			final Main main=new Main();
    			final CountDownLatch count = new CountDownLatch(10000);  	
    			for(int i=0;i<100;i++){
    				new Thread(new Runnable() {	
    					public void run() {
    						// TODO Auto-generated method stub
    						for(int j=0;j<100;j++){
    							try {
    								Thread.sleep(10);
    							} catch (InterruptedException e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							}
    							main.incr();
    							count.countDown();
    						}
    					}
    				}).start();
    		
    			}
    			//主线程等待子线程结束
    			count.await();
    			System.out.println(main.getI());
    		}
    		
    		
    
    		
    	}
    
    }
    


    测试10次,几乎都不是10000


    2.i++线程非安全原理




    i++ 操作分为三步,第一步取i的值,第二步 让i加1 ,第三步更新i的值

    如图主线程主有个i ,每个子线程中有一个i的拷备,当主线程i=0是,如果三个子线程同时读取到i的值为0,每个线程各自给i=i+1,然后分别写入主线程,这样三个线程执行后,虽然执行了3次i++ ,不过i的值为1.




    3.线程安全做法一 synchronized



    4.线程安全做法二 Lock







  • 相关阅读:
    一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)
    dynamic与var
    转载-V.I.Arnold, beyond a mathematician
    转载---青年问禅师
    转载-傅里叶级数的几何意义 – 巧妙记忆公式的方法
    转载--柯尔莫哥洛夫
    转载--黎曼
    动态规划复习
    几匹单调队列水题
    fastIO
  • 原文地址:https://www.cnblogs.com/whzhaochao/p/5023408.html
Copyright © 2020-2023  润新知