JavaSE - Day18 (线程安全问题)

线程安全

原因:

       在多个线程操作同一个资源的时候,会导致数据不安全

名词介绍:

        同步: 同时只能被一条线程所执行 ( 线程是安全的)

        异步: 同时可以有多个线程执行数据 ( 线程是不安全的)

解决:

        思路:

                保证同时只能有一条线程在操作数据,并且锁对象是同一个

        方案一:

                同步代码块

                语法:

                        synchronized (锁对象){

                                要同步的代码块;

                        }               

                注意:

                        锁对象 可以是任意一个类的对象

        方案二:

                同步方法

                语法:

                        权限修饰符 synchronized 返回值类型 方法名 (形参列表){

                               方法体;

                                返回值类型;

                        }

                注意:

                        锁对象: 谁调用同步方法 谁就是锁对象

        方案三:

                同步静态方法

                语法:

                        权限修饰符 static synchronized 返回值类型 方法名 (形参列表) {

                                方法体:

                                返回值类型

                        } 

                注意:

                        锁对象就是该类的对象

死锁(了解)

为什么会产生死锁?

        因为多个线程相互需要对方所死锁的资源,相互都进入等待状态

怎么避免:

        尽量在同步中不使用同步

线程的休眠 与 唤醒

休眠:

        有限期休眠: sleep() wait()

        无限期休眠:wait()

        注意: sleep  和  wait 的区别

                相同点:

                        两者都可以对线程进行休眠

                        休眠单位都是毫秒为单位

                不同点:

                        sleep:

                                对线程进行休眠的时候不可以释放锁

                                调用对象只能是Thread 或 其对象

                                可以在任意位置进行调用

                        wait:

                                对线程进行休眠的时候会释放锁

                                只能使用该方法 或者 调用该方法的对象对其调用

                                只能在同步方法或者同步代码块中调用

                                属于Object类提供的方法

                                wait() 括号中没有任何参数 那么就是无限期休眠

唤醒

        对象.notify()随机唤醒一个使用该对象作为锁对象的线程

        对象.notifyAll() 唤醒全部使用该对象做为锁对象的线程

::总结::

        为什么要使用同步?

                保证多个线程操作数据的时候不会出现错乱

        如何解救?

                使用同步的方法解决

        同步的三种方案?

                1.同步代码块:

                        锁对象由我们自己创建

                2.同步方法:

                        锁对象是该方法 或者 调用该方法的对象

                3.静态同步方法 :

                        锁对象就是该类对象

        使用同步需要注意的是什么?

                1.分析需要同步的地方

                2.保证锁对象是同一个

                3.避免死锁

        线程之间的通讯?

                休眠:

                        让线程进入休眠状态,不在争夺cpu的执行权

                唤醒:

                        让线程从休眠状态转换成就绪状态,准备抢夺cpu的执行权

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值