• Java线程同步


    一、定义

    当两个或多个线程需要访问同一资源时,需要以某种顺序来确保该资源某一时刻只能被一个线程使用

    二、实现线程同步的方法

    同步方法( synchronized )
    同步代码块( synchronized)
    

    三、同步代码块

    同步代码块:synchronized放在对象前面限制一段代码的执行
    

    语法格式:

    synchronized(对象)//这个对象可以为任意对象 ,该对象就是锁
    { 
        需要被同步的代码 
    } 

    同步条件

        必须要有两个或者两个以上的线程 
    

    缺点:

    多个线程需要判断锁,较为消耗资源
    

    四、锁

    互斥锁

        同一时刻只能有一个线程占用,其他线程要等这个线程执行完释放锁以后才能使用锁
    

    任意锁

        可以是任意类型对象
    

    多个线程必须使用同一个锁 , 才能起到互斥的作用

    同步中的锁

        同步代码块:this或其他共同对象
        非静态方法:this
        静态方法:类.class
    

    注意:

    任意锁和互斥锁是同一个锁,只是从不同角度出发,定义为不同的锁。任意锁:指对象类型可以任意;互斥锁指锁一次只能让一个线程用
    

    五、同步方法

    同步非静态方法

        synchronized放在方法声明中,表示整个方法为同步方法,锁定this对象,如果有一个线程进入了该方法,其他线程要想使用当前this对象的任何同步方法,都必须等待前一个线程执行完该同步方法之后
    

    同步静态方法

         synchronized放在static方法声明中,表示锁定该类的class对象(Xxx.class,是Class类型的,是描述一个类的信息的对象)
        如果有一个线程进入了该方法,其他线程要想使用当前类中的任何同步静态方法,都必须等待前一个线程执行完该同步方法之后;其他非同步方法及非静态的同步方法的执行不受影响
    

    六、锁的选择

    多个线程共享资源,为了保证数据安全,需要同步
    一般情况下选择资源作为锁(必须为引用类型)即可,也可以选择其他唯一的对象
    

    七、死锁

    线程双方都持有者自己的锁不放,还想要对象的锁,僵持着,于是产生死锁
    

    死锁发生的条件

        同步中嵌套同步
        锁不同
    

    八、守护线程

    1)在Java中有两类线程
        User Thread(用户线程或前台线程)  
        Daemon Thread(守护线程或后台线程)
    
    2)其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了
    
    3)设置守护线程的方法要写在 start前面
    
    4)子线程设置成为守护线程, 当主线程 执行完了,子线程就结束执行
    
    5)线程对象.setDaemon(true)   默认为false
    
  • 相关阅读:
    MongoDB for OPS 02:复制集 RS 配置
    MongoDB for OPS 01:服务介绍与基本使用
    Redis for OPS 07:Redis 补充说明
    Redis for OPS 06:Redis Cluster 集群
    google ctemplate——c++模板引擎
    libctemplate——源码分析
    使用gulp对js、css、img进行合并压缩
    Windows平台交叉编译Arm Linux平台的QT5.7库
    使用gtest对DLL工程进行单元测试的实践
    websocket++简单使用例子
  • 原文地址:https://www.cnblogs.com/TCB-Java/p/6797621.html
Copyright © 2020-2023  润新知