zoukankan      html  css  js  c++  java
  • 五、多线程中的临界资源问题以及解决方案


    1.产生原因
    临界资源:被多个线程同时访问的资源
    如果有多个线程同时访问同一份资源,这个资源对应的值有可能会出现值不准确的情况【临界资源产生的原因:在多个线程访问同一份资源的时候,如果一个线程在取值的过程中,时间片又被其他线程抢走了,临界资源问题就产生了】

    2.解决方案
    当多个线程同时访问同一份资源的时候,如果其中的一个线程抢到了时间片,如果给这个资源“上一把锁“,这个时候其他剩余的线程只能在锁外面进行等待

    3.锁
    对象锁:任意的对象都可以充当一把锁
    类锁:把任意一个类当做锁,格式:类名.class

    4.使用锁来解决临界资源问题
    1>同步代码块
    语法:
    synchronized(锁) {
    //需要访问的临界资源
    }
    说明:
    a.程序执行到了这个代码段中,就用锁锁住了临界资源,这个时候,其他的线程将不能执行代码段中的代码,只能在锁外面进行等待
    b.当执行完代码段中的代码时,会自动解锁,然后剩下的线程就可以开始争抢cpu时间片
    c.一定要保证不同的线程看到的是一把锁,否则解决临界资源问题没有任何意义

    同步代码块和对象锁的使用
    同步代码块和类锁的使用

    2>同步方法
    语法:
    sychronized 访问权限修饰符 返回值类型 函数名(参数列表) {
    //需要访问的临界资源
    }

    说明:
    a.如果一个线程走到这个方法内部,就会用锁来锁住临界资源,其他的线程将不能进入到这个方法的内部
    b.隐式锁,如果这个方法是静态方法,锁是类锁【当前类】,如果是一个非静态方法,则是一个对象锁【this】


    3>显式锁【同步锁】
    通过使用ReentrantLock这个类来进行锁的操作,实现了Lock接口
    使用ReentrantLock来进行显式的加锁和解锁
    lock():加锁
    unlock():解锁

  • 相关阅读:
    归并排序
    CTE 递归
    Cordova 入门文档
    Javascript 原型链
    Windows11 正式版偷渡开启安卓子系统
    快速解决gerrit merge confict问题
    利用VPS来搭建个人主页
    检测串行序列10010
    Verilog语法总结
    深度学习中常见优化算法学习笔记
  • 原文地址:https://www.cnblogs.com/lsp-lsp/p/7344403.html
Copyright © 2011-2022 走看看