多线程
tangzongyuan
这个作者很懒,什么都没留下…
展开
-
volatile解决可见性,但是不能保证线程安全
violate只能保证A线程改变变量i的时候会立即写入到共享内存中,然后告诉其它内存,你们各个线程的工作内存的变量已经被我改了,你们要重新去共享内存读取,但是i++的操作不是一个原子操作,i++的操作是读取i的值,然后+1,写回共享内存,。如果A线程在读取i的值之后还没写入到共享内存,然后cpu被抢夺,执行B线程,这时候B线程也执行i++,B去读取i的值,然后B将i+1,并写回内存,然后cpu又被抢夺执行A,但是这时候A线程因为已经读取了i的值,所以i+1,然后写回内存,两个线程写回了同一个值i只+1而不是原创 2020-09-16 10:31:41 · 1118 阅读 · 0 评论 -
sleep不会释放锁,但是会让出cpu执行权
A线程调用sleep方法不会释放锁,所以其它和A线程一起持有一把锁的A1、A2线程就不会执行,但是另外的线程不需要持有这把锁的线程是可以被cpu执行的,例如主线程,B1、B2线程。 sleep和wait方法的区别就是sleep不会释放锁,当睡眠的时间到了之后,线程会自动进入可执行状态,等待cpu的执行。而wait方法会释放锁(所以前提就是线程在执行wait方法之前必须要获得锁,也就意味着只能在同步方法或者同步代码块中调用wait方法),释放锁之后,必须要有另外线程执行notify或者notifyA.原创 2020-06-03 15:58:29 · 6668 阅读 · 4 评论