Java的关于线程同步和互斥方面的策略有很多,比如synchronized、信号量、线程的wait和notify方法等等。讲解之前我们有必要区分对象、类和线程的所有权关系。首先声明一点:一个对象可以有多个线程共享,比如我们在一个类A中写十个内部类,这十个内部类都继承Thread类,然后类A中有十个属性,分别是十个内部线程类的对象,这种情况就属于多个线程共享一个对象;我们还必须清楚的认识到,一个类也可以有多个线程共享,比如我们有个类B继承了Thread类,我们在另外一个类中用循环new十个B的对象并启动线程,那么这十个线程就共享B类的所有静态属性。
下面一个一个来讲解:
我们先来看看原始的代码是怎样的,如下所示,这是一个售票的程序,共有十个售票员线程,想共同把150张票售完,代码如下所示:
_______________________________________________________________________________
public class SynchorizedTest implements Runnable{
private static int num=150; //表示总共的票数 150,所有对象共享
private int seller; //表示售票员的编号
SynchorizedTest(int seller){ //构造方法 可以指定对象是哪个销售员
this.seller=seller;
}
private void sell(){ //当前售票员的售票方法
if(num>0){
System.out.println("seller"+this.seller+":ticket"+num+" isselled!");
num--;
}
}
public static void main(String[] args) {
for(int i=1;i<=10;i++){
SynchorizedTest st=new SynchorizedTest(i);
new Thread(st).start();
}
}
@Override
public void run() { //每个售票员线程都执行相同的售票操作
while(true){
sell();
if(num<=0)