t1.join();
t2.join();
System.out.println(counter.count);
}
}
运行结果:
很遗憾并没有达到我们的预期结果...由于每个线程有自己的工作内存, 这些工作内存中的内容相当于同一个共享变量的 “副本”. 此时修改线程1 的工作内存中的值, 线程2 的工作内存不一定会及时变化。...具体线程间指令集可能出现的情况如下:
情况1:线程之间指令集没有任何的交叉,实际值等于预期值。具体如下图所示
情况2:线程之间指令集存在交叉,实际值小于预期值。...}//退出该代码块,相当于针对当前对象"解锁"
}
synchronized用的锁是存在Java对象头里面,可以简单的理解为,每个对象在内存中存储时,都会有一块内存表示当前"锁定"的状态,相当于记录有没有人使用...这个排队并不是真正意义上的按顺序来,在操作系统内部会维护一个等待队列,当这个锁被某个线程占有的时候,其他线程尝试进行加锁,就加不上,就会阻塞等待,一直等待之前占有锁的线程解锁之后,由操作系统唤醒一个新的线程