本帖最后由 feigecal 于 2012-7-3 15:07 编辑
所谓锁就好比一个房间,你进来后把门锁上,别的人就不能进来,你把你要做的事情做完了,把锁打开出去后别人才能进来。这里的人就好比是线程,一个线程判断锁后进去后,就会锁上,另一个线程就进不去,防止一个线程在进去后判断tick大于0后还没执行输出语句没有改变if的条件的时候另一个线程也进来,就会造成tick大于0被两个线程都判断过,就会出现0和负数的结果。再说主函数的顺序吧,先new出一个资源的对象,然后把对象做为创建线程的参数传进去,来创建同资源的两个线程t1和t2,先开启了t1线程,主线程睡了10毫秒然后读下一个语句,就是把标记flag改为false,然后再开启线程t2,因为在之前已经把标记改了,所以线程t2是进不以if的执行语句的,也就进不了同步代码块,同时线程t1也在循环里不能出来,因为是while(true),所以线程t2直接执行else,执行同步函数,因为同步函数的锁是对象,就是this,所以同步代码块的锁也得是this才能同步。然后他们就相当于是两个窗口售票,各执行各的,但用的是同一资源,也解决了安全问题。 |