线程的安全性问题

线程安全性的三个体现


原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作(Atomic、CAS算法、synchronized、Lock)
可见性:一个主内存的线程如果进行了修改,可以及时被其他线程观察到(synchronized、volatile)
有序性:如果两个线程不能从 happens-before原则 观察出来,那么就不能观察他们的有序性,虚拟机可以随意的对他们进行重排序,导致其观察观察结果杂乱无序(happens-before原则)
 

当多个线程同时操作统一资源的时候就会带来线程不安全。并发问题

队列和锁机制能够解决这个问题

让线程排队,而且一个线程操作资源时获得排他锁,让其他需要锁的线程等待

虽然解决了问题但也带来了其他问题。

sychronized(同步监视器,即锁){
//操作共享数据的代码
}

sychronized执行时其他线程不得访问其资源。

线程的死锁问题

它的本质是由于同步机制引起的,不同的线程占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源
解决方法:
1.专门的算法、原则
2.尽量减少同步资源的定义
3.尽量避免嵌套同步

死锁问题我理解为 我操作着我的资源但这时候需要操作你的资源,正巧你操作着你的资源也要操作我的资源,各不相让就会造成死锁问题。

Lock锁类

  @Override
    public void run() {
        while (true) {
            try {
                //2.打开锁
                lock.lock();
                if (TicketDemo.tickets > 0) {
                    TicketDemo.tickets--;
                    System.out.println(TicketDemo.tickets + "\t" + Thread.currentThread().getName());
                } else {
                    break;
                }
            } finally {
                //3.关闭锁
                lock.unlock();
            }

        }

synchronized与lock的对比

1.lock是显式锁,需要手动开启和关闭锁,synchronized是隐式锁,出了作用域自动释放
2.lock只有代码块锁,synchronized有代码块锁和方法锁
3.lock锁可以使JVM更快地调度线程,性能更好

线程通信
常用:wait() notify() notifuAll()
注意:
1.这三个方法需要在同步方法或者同步代码块里调用
2.这三个方法的调用者是同步监视器
3.这三个方法定义在Object类中

wait() 与 sleep()的不同
1.两个方法的声明位置不同,一个在Object类,一个在Thread类
2.两个方法的调用要求不同,wait()只能在同步代码块或者同步方法调用,sleep()可以在任何场景调用
3.sleep()不会释放同步监视器,wait()会

使用​​​​​​​线程池

         //1.创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        //4.设置线程池属性
        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executorService;
        threadPoolExecutor.setCorePoolSize(15);

        //2.使用线程池
        executorService.execute(new Thread1());
        executorService.submit(new Thread2());

        //3.关闭线程池
        executorService.shutdown();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeeGaKi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值