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():解锁

  • 相关阅读:
    NET Core-TagHelper实现分页标签
    NET Core-学习笔记(三)
    NET Core-学习笔记(二)
    NET Core-学习笔记(一)
    MVC默认路由实现分页-PagerExtend.dll
    Tomcat优化
    JVM参数配置大全
    tomcat8+memcached session共享
    Tomcat+Nginx+Redis+MySQL实现反向代理、负载均衡、session共享
    搭建Tomcat应用服务器、tomcat虚拟主机及Tomcat多实例部署
  • 原文地址:https://www.cnblogs.com/lsp-lsp/p/7344403.html
Copyright © 2011-2022 走看看