解决线程安全的方式

方式一:同步代码块
synchronized(同监视器){
//需要被同步的代码
}
说明:
1.操作共享数据的代码,即为需要被同步的代码。
2.共享数据:多个线程共同操作的数据。
3.同步监视器:俗称,锁。任何一个类的对象都可以充当这个锁
4.在实现类Runnable中创建多线程的方式中可以考虑用this关键字来充当锁(同步监视器),实现线程安全问题(保证使用同一把锁)
5.在Thread继承类实现多线程的方式中,慎用this关键字充当锁,可以考虑使用当前类充当同步监视器(保证使用同一把锁)

例如:Runnable实现类的方式如下处理

package com.itweiting.exer;

/**
 * @Description Rannable实现多线程买票
 * @User Administrator
 * @Time 2021/3/29__15:38
 * @
 */
class Windows implements Runnable {
    private int ticket = 100;
    Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            synchronized (obj) {
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "\t票号为:" + ticket);
                    ticket--;
                } else {
                    System.out.println("票已售完");
                    break;
                }
            }
        }
    }


    
}
public class RannableSaleTicket {
    public static void main(String[] args) {
        //创建对象
        Windows windows=new Windows();
        Thread window1=new Thread(windows);
        window1.setName("窗口1");
        window1.start();
        Thread window2=new Thread(windows);
        window2.start();
        window2.setName("窗口2");
        Thread window3=new Thread(windows);
        window3.start();
        window3.setName("窗口3");
    }
}

表面上看着像单线程

方式二:同步方法
同步方法总结:
1.同步方法仍需要同步监视器,只是不需要显示的声明
2.非静态的同步方法,同步监视器是:this
静态的同步方法,同步监视器是:当前类本身

例如:同步方法处理Runnable实现类的方式如下

package com.itweiting.exer;

/**
 * @Description 使用同步方法解决Runnable的线程安全问题
 * @User Administrator
 * @Time 2021/3/29__21:02
 * @
 */
class Window3 implements  Runnable{
    private static int ticket=100;


    @Override
    public void run() {

        while (true) {
            show();
            if (ticket==0){
                break;
            }
        }
    }
    public synchronized void show(){

        if (ticket > 0) {
            System.out.println(Thread.currentThread().getName() + "\t" + ticket);
            ticket--;
        }else{
            System.out.println("票已售完");
        }

    }
}
public class RunnableTest1 {
    public static void main(String[] args) {
        Window3 window3=new Window3();

        Thread t1=new Thread(window3);//第一个窗口
        Thread t2=new Thread(window3);//第二个窗口
        Thread t3=new Thread(window3);//第三个窗口
        //给线程命名
        t1.setName("线程001");
        t2.setName("线程002");
        t3.setName("线程003");

        //启动线程
        t1.start();
        t2.start();
        t3.start();



    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值