zoukankan      html  css  js  c++  java
  • 【幻化万千戏红尘】qianfengDay22-java基础学习:线程安全、synchronized、死锁

    课程回顾:

    进程:独立的应用程序
    多进程
    线程:进程内部的执行路径
    多线程
    线程的创建方式:
    1、继承Thread
    2、实现Runnable
    用户和守护线程
    优先级
    线程调度
    生命周期

    今日内容:
    线程安全:当多个线程操作同一数据源时,可能会引发数据安全的问题
    引发线程安全的条件:
    1、多线程
    2、同一数据源
    3、修改数据源
    只有满足上述条件,才有可能会出现安全问题

    避免线程安全:尽量使用局部变量,少用成员变量


    synchronized ['sɪŋkrənaɪz] 互斥锁关键字,同步,主要是解决线程安全的问题
    1、修饰代码块:同步代码块,出现在方法中
    格式:synchronize(Object){
     可能引发安全的代码块
    }
    锁的存在可以保证,在任何一个时刻只能有一个线程拥有它
    如果线程要为对象上锁,如果对象可以上锁,那么就上锁成功,如果对象已经上过锁,
    当前线程会由运行状态进入阻塞状态,等待着对象的锁的释放


    2、修饰方法:同步方法
    格式:[修饰符] synchronize 返回值类型 方法名([形式参数列表])
     {
      可能引发安全的代码块
     }
    修饰非静态/对象/实例方法,锁的是本类对象
    修饰静态方法,锁的是类对应的Class对象

    多线程:切记只有当多个线程在操作同一个锁的对象的时候,才会引起阻塞,保护数据

    死锁:
    多个线程之间相互锁住彼此需要的对象,
    从而使得多个线程都进入了阻塞状态,无法参与CPU的抢夺,就照成了死锁

    比如:A线程锁住资源1,等待资源2,B线程锁住资源2等待资源1,这时2个线程都会阻塞,最终带来死锁现象

    所有我们在开发中,需要加大锁的粒度
    就是说,我们尽量锁当前类对象,而不要去锁类内部的属性


     

  • 相关阅读:
    IO多路复用 IO异步
    你没听说过的协程
    事件驱动和IO操作
    堡垒机前戏——paramiko
    听说过的多进程,多线程到底是什么鬼
    socket套接字
    看见就烦的异常
    struts2值栈内部数据结构详解
    hibernate一级缓存的源码初窥
    使用自定义标签模拟jstl的<c:for each>标签
  • 原文地址:https://www.cnblogs.com/weigongcheng/p/5759853.html
Copyright © 2011-2022 走看看