【多线程】有两个线程都能访问n,初始时n为0,⼀个线程执⾏n++,n+=2,另⼀个线程执⾏n+=3,当两个线程都执行完后n可能的值

必备知识点:n++ 在底层是由三条指令在CPU完成的

  1. load : 将内存的值读取到CPU寄存器
  2. add : 将CPU寄存器中的值进行+1操作
  3. save : 将CPU寄存器中的值写回内容

回答

首先n++操作在底层是由三条指令在CPU完成的,先要将内存中n的值读取到CPU寄存器,然后将CPU寄存器中的值进行+1,最后再将CPU寄存器中的值写回内存。两个线程并发的去执行时有以下几种情况:

  1. 线程1中n++与线程2中n+=3同时执行然后线程1再执行n+=2,有以下几种情况(同时读取到0)
  • 线程1中n++执行时读取到内存中n的值为0,此时线程2中n+=3也读取内存中n的值为0,此时n++在CPU寄存器进行+1后先写回了内存,此时内存中的值为1,这个时候线程2中的n+=3也在寄存器中执行完写回内存,此时内存中的值又被修改为3。在上述描述中线程1执行n+=2时,如果n++后写回内存,那么结果就是3,如果n+=3后写回内存,那么结果就是5.
  1. 线程1中n++执行时先读取到0
  • n++执行完成后,此时n+=2读取到内存的值为1后继续执行,这个时候有种情况,此时n+=2后执行完,结果也就是3,还有一种是线程2中n+=3后执行完也就是4
  1. n++执行完成后,此时线程2中的n+=3读取到内存中的1开始执行,此时也有三种情况,就是n+=3后执行完成,结果也就是4,还有是n+=2后执行完,结果也就是3,还有一种就是n+=3执行完成后,此时内存中n的值为4,然后线程1中的n+=2读取到内存中的值为4,再执行add与save,最后结果是6
  2. 线程2中n+=3先读取到0
  • n+=3执行完毕后内存中n的值为3,此时线程1中n++再读取到3执行后为4,n+=2执行后,结果是6

你可能感兴趣的:(Java,java,jvm,开发语言)