** 多个线程同时运行,线程的调度是由操作系统决定的,程序本身无法决定。**
多次运行上述代码你会发现结果不同。
一个相加赋值的操作本身是由三部分组成的,加载,相加,赋值,如果当thread1加载进数据后就被暂停了,thread2获得了cpu的执行权,执行加载也会将未被修改的加载进去,在进行之后的操作后,就能得到两边的结果都是101。同时也说明相加赋值的操作不是原子性操作。
为了保证一系列操作作为原子操作,必须保证一系列执行过程中,不被其他进程所抢占。我们可以对代码进行加锁和解锁。
synchronizatied代码块无法并发执行,加锁解锁需要消耗时间,所以性能比较低。
死锁
wait和notify
因为我们使用的是this对象作为我们的锁对象,所以使用this来调用wait方法