** 多个线程同时运行,线程的调度是由操作系统决定的,程序本身无法决定。**
图片说明
多次运行上述代码你会发现结果不同。
图片说明

一个相加赋值的操作本身是由三部分组成的,加载,相加,赋值,如果当thread1加载进数据后就被暂停了,thread2获得了cpu的执行权,执行加载也会将未被修改的加载进去,在进行之后的操作后,就能得到两边的结果都是101。同时也说明相加赋值的操作不是原子性操作。
为了保证一系列操作作为原子操作,必须保证一系列执行过程中,不被其他进程所抢占。我们可以对代码进行加锁和解锁。
图片说明
图片说明
图片说明
synchronizatied代码块无法并发执行,加锁解锁需要消耗时间,所以性能比较低。
图片说明
图片说明
图片说明
图片说明

图片说明

图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明

死锁

图片说明
图片说明
图片说明

图片说明

图片说明
图片说明

图片说明

wait和notify

图片说明
因为我们使用的是this对象作为我们的锁对象,所以使用this来调用wait方法
图片说明

图片说明
图片说明