同步方法处理线程安全问题之继承Thread类[java]

同步方法处理继承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--;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值