同步方法处理继承Thread类的线程安全问题
这里我们就和同步方法解决实现Runnable接口的方式一样,也是需要将需要同步的代码写到一个方法中去(同样的我们这里也要注意我们的方法中尽量不要包一些不需要同步的代码,也就是我们尽量只包操作共享资源的代码),那么同样的我们使用同步方法时也需要使用默认的锁,那么这个时候我们如果是使用非静态方法的的默认锁(也就是this关键字的方式不可以真正的解决继承Thread类的方式创建的线程的安全问题),因为我们继承Thread类的方式创建的多线程之间没有天然的资源共享,这个时候我们使用this关键表示的不是一个对象,而是表示的多个对象,也就是我们这个时候的多个线程就没有共享同一把锁,这个时候我们就要使用继承类.class作为同步监视器,那么这个时候我们如何让这个方法可以默认为本类(继承类).class?,这个时候我们就要如何解决呐?-----我们这个时候就要使用static关键字修饰这个方法,这个时候如果我们这个方法是一个静态方法,那么它的默认的锁就不是this关键字,而是本类的对象了
总结:我们使用继承Thread类的方式创建的多线程的线程安全问题,如果我们要想使用同步方法的方式解决的话,那么我们就要将这个方法使用static关键字修饰
这里我们举一个例子
public class Window4Test {
public static void main(String[] args) {
Window4 window1 = new Window4();
Window4 window2 = new Window4();
Window4 window3 = new Window4();
window1.setName("窗口一");
window2.setName("窗口二");
window3.setName("窗口三");
window1.start();
window2.start();
window3.start();
}
}
class Window4 extends Thread{
static private int ticket=100;
public void run(){
while(true){
tongBu();
}
}
public static synchronized void tongBu(){
/*
这里我们使用static关键字修饰这个同步方法,这个同步方法的默认的同步监视器(锁)就是以本类这个类作为对象,也就是Class class1 = Window4.class; (这个时候我们的Window4类作为了Class类中的一个对象)
*/
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"正在卖票,票号为:"+ticket);
ticket--;
}
}
}