多线程的并发问题?

1、描述

    在一个CPU上同时运行多个线程时,会存在多个线程竞争CPU资源的问题,但是有时候一段代码是不允许打断,或是出现死锁的状态。

    死锁:多个线程出现了锁嵌套,形成资源互相等待的状态,使程序无法继续运行。

2、解决或避免死锁状态的方法

    ①引入锁对象-----synchronized(同步代码块)

        在需要遵循原子性代码段的地方使用

                synchronized(){

                }

        其中锁对象可以是:共享资源,类的字节码,this

        注意:this作为锁对象时,需要使用同一个Runnable对象启动所有的Thread线程

    ②避免死锁:减少线程数量,统一锁对象,减少锁嵌套

    ③等待唤醒机制:使用等待唤醒机制调节线程执行的顺序,如下图:a1,a2为同一类型线程,有资源竞争关系;c1,c2同样。

            初始状态:

                    

            a1线程运行中:

                    

            a1线程运行时,a2线程也需要运行,但是因为资源不足,需要将a2线程设为等待:

                    

             c1线程运行

                        

             c2线程需要运行,但是资源被c1占用,于是到等待线程池中等待c1执行完成:

                        

             a1线程执行完成,唤醒在等待池中的a2:

                        

            c1线程执行完成,唤醒在等待池中的c2:

                        

            最终,a2线程和c2线程都执行完成,这样一个多线程的就有序进行:

                        

3、线程的5/7种状态关系图:

                            

4、sleepwait的区别:     

    sleep在使用的时候需要指定休眠时间,到点自然醒。释放执行权,不释放。是一个静态方法,设计在了Thread

    wait在使用的时候可以指定等待时间,也可以不指定,如果不指定等待时间就需要唤醒。释放执行权,释放。是一个非静态 方法,设计在了Object



    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值