大家注意了!请仔细参考下面的例子:
package synh;
/*class ThreadDemo implements Runnable{
int tickets = 100;//票数
String str = new String("");
public void run(){
% while(true){
%% /*
%%% *分析 synchronized 方法
%%% *synchronized 代码块中的语句只能有一个线程在执行
%%% *
%%% *任意一个对象都有一个标志位,有 1 和 0 两种状态
%%% *当程序执行到 synchronized 代码块的时候线程会检查对象的标志位是 1
还是 0
%%% *如果是 1 则执行程序,同是将对象的标志位设置为 0,其他线程执行到
synchronized 代码块时一看对象标志位为 0
%%% *则线程会阻塞,一直等到对象的标志位为 1 再执行下面的程序
%%% *本程序中一共产生了 4 个线程,当一个线程执行 synchronized 代码块的
时候其他三个线程会发生阻塞
%%% *第一个线程执行完 synchronized 代码块后会把对象的标志位设置为 1,
其他的三个线程中的其中一个
%%% *会抢到 synchronized 代码块的执行权,同时会把对象的标志位设置为
0,就以这样的顺序循环执行
%%% *
%%% *我们也可以把对象标志位看成一个监视器,当一个线程执行到
synchronized 代码块的时候会检查监视器的
%%% *状态,一个刚执行完 synchronized 代码块的线程也可以再次检查监视器
并执行 synchronized 代码块
%%% *
%%% *多个线程要实现同步,必须使用相同的监视器对象(本例中 4 个线程都是
用的 str 同一个对象),
%%% *如果多个线程使用的不是同一个监视器对象则达不到同步的效果
%% *
%% synchronized(str){
%%% if(tickets > 0){
%%%% try{Thread.sleep(1);}catch(Exception e){}
%%%% System.out.println(Thread.currentThread().getName() + " is
salling ticket --- " + tickets--);
%%% }
%% }