Synchronized

作用:能够保证在同一时刻最多有一个线程执行该段代码,以保证并发的安全性。(当第一个线程去执行该段代码的时候就拿到锁,并独占这把锁,当方法执行结束或者一定条件后它才释放这把锁,在没释放锁之前,所有的线程处于等待状态)

不控制高并发的后果:

 预期值本来是20000,但是没有控制并发,所以结果不一样

原因:

  i++,看上去知识一个操作,实际上包含了三个动作

  1,读取i

  2,将i加1

  3,将i的值写入到内存中

出现结果与预期不一样的原因是当执行完第一个线程的时候,可能第二个线程就进入执行,就被打断了,结果还没有写入到内存中,(当i为5,第一个线程进入方法,将i+1 ,结果i=6,但是还没有写入,第二个线程就进去,它读到的值不是6,而是5,因为第一个线程还没有将i写入内存),这样是线程不安全的

Synchronized的两种使用方法

第一种使用方法:对象锁

代码块形式:将关键字包裹方法体,this是锁,可以自己定义锁,可以定义多把锁Object object = new Object)

方法锁形式:

方法锁可以被多个对象拥有,他们之间互不影响,可以各自运行,也可以同时运行

 

第二种使用方法:类锁

用法和效果:类锁只能在同一时刻被一个对象拥有,而方法锁可以被多个对象拥有,他们之间互不影响,可以各自运行,也可以同时运行,而类锁只能是一个对象单独运行

类锁第一种形式:静态方法锁(Synchronized加在static方法上)

加了static

没有加static

当我们处理业务的时候,如果需要全局同步的时候,就可以使用静态方法锁,

类锁第二种形式:.class形式

使用了此代码块,所有的线程需要一个一个的排队访问

生命不止,折腾不息
原文地址:https://www.cnblogs.com/steakliu/p/10656171.html