synchronized的一个简单实例

//synchronized的作用  只能有一个线程执行该synchronized块
//synchronized块之外的其他代码是可以被多个线程同时访问到的
//★1 和  ★2 区块  选择一个执行  对比能够体现出 synchronized 的作用

在 Eclipse中  Ctrl+Shift+/   ---->添加   /**/注释       Ctrl+Shift+\  取消/**/注释 

public class Test1 {
	public  static int count = 0;
 
     public static void inc(int threadNumber) {
 
         //这里延迟1毫秒,使得结果明显
         try {
             Thread.sleep(10);
         } catch (InterruptedException e) {
         }
            
/*         //★1没有被synchronized区块保护  能被多个线程同时访问 会造成  count++ 之前的数值 和之后的数值 不是偏差1
           System.out.println("线程:" + threadNumber+"   count++ 之前:"+count );
           count++;
           System.out.println("线程:" + threadNumber+"   count++ 之后:"+count );
*/
         
        //★2 能被多个线程打印出来  但是下面的synchronized区块只能一个线程访问  所以存在线程在这里排队的情况
        System.out.println("我是线程:" + threadNumber);// 这里没有被synchronized区块保护 能查看到排列的线程 进程执行到这里 排队等待 
        synchronized (Test1.class) {
        // synchronized区块保护的话 只有一个线程能访问变量 count 必须排队访问  count的值被依次增加 偏差一定是1
        System.out.println("线程:" + threadNumber+"   count++ 之前:"+count );
        count++;
        System.out.println("线程:" + threadNumber+"   count++ 之后:"+count );

   }




  }
 
     public static void main(String[] args) {
 
         //同时启动1000个线程,去进行i++计算,看看实际结果    count 是否是连续增加 
    	 Test1 test1 = new Test1();
         for (int i = 0; i < 1000; i++) {
          Task t = test1.new Task(i);
          new Thread(t).start();
         }


         try {
             Thread.sleep(1000);
         } catch (InterruptedException e) {
         }
         System.out.println("main 最终运行结果:Counter.count=" + Test1.count);
     }
     




  class Task implements Runnable{
           int Threadnumber;
           public Task(int i) {
            Threadnumber = i;
   }
   @Override
   public void run() {
             Test1.inc(Threadnumber);   
   }
};


}

★1 没有  synchronized 保护执行的结果如下

   

线程访问前后偏差不为1



★2 有  synchronized 保护执行的结果如下

      

能看到线程阻塞 排队执行   每次执行的结果  count前后偏差为1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值