分析下synchronized方法 :synchronized代码块中的语句只能有一个线程在执行,任意一个对象都有一个标志位,有1和0两种状态当程序执行到synchronized代码块的时候线程会检查对象的标志位是1还是0 ,如果是1则执行程序,同时将对象的标志位设置为0,其他线程执行到synchronized代码块时一看对象标志位为0 ,则线程会阻塞,一直等到对象的标志位为1再执行下面的程序.在上面的程序中一共产生了4个线程,当一个线程执行synchronized代码块的时候其他三个线程会发生阻塞 :第一个线程执行完synchronized代码块后会把对象的标志位设置为1,其他的三个线程中的其中一个会抢到synchronized代码块的执行权,同时会把对象的标志位设置为0,就以这样的顺序循环执行
我们也可以把对象标志位看成一个监视器,当一个线程执行到synchronized代码块的时候会检查监视器的状态,一个刚执行完synchronized代码块的线程也可以再次检查监视器并执行synchronized代码块
多个线程要实现同步,必须使用相同的监视器对象(上面程序的4个线程都是用的str同一个对象)如果多个线程使用的不是同一个监视器对象则达不到同步的效果
|