zoukankan      html  css  js  c++  java
  • JAVA基础知识总结:十九

    一、多线程使用过程中的临界资源问题

    1.临界资源:被多个线程同时访问的资源

    临界资源产生的原因:有多个线程同时访问一个资源的时候,如果一个线程在取值的过程中,时间片又被其他的线程抢走了,临界资源问题就产生了


    如何解决临界资源问题?
    一个线程在访问临界资源的时候,如果给这个资源上一把锁,这个时候如果其他线程也要访问这个资源的话,就需要在锁外面等待


    2.锁:

    对象锁:在Java中,任意的对象都可以被当做锁来使用
    类锁:把一个类当做锁,语法:类名.class


    二、使用锁来解决临界资源问题

    1.同步代码块
    语法:
    synchronized(锁) {

    }

    说明:
    a.程序执行到了同步代码块中,就使用锁锁住了临界资源,这个时候,其他的线程是不能执行代码段中的代码的,只能在锁外面进行等待
    b.执行完代码段中的代码,会进行自动解锁,那么这个时候其他的线程开始争抢时间片
    c.一定要保证不同的线程看到的是同一把锁,否则同步代码块没有意义


    2.同步方法
    synchronized 访问权限修饰符 返回值类型 函数名(参数列表) {
    //被多个线程可以同时访问的临界资源
    }

    3.同步锁(JDK1.5之后新增的)
    可以通过定义同步锁对象来实现同步,和同步代码块以及同步方法具有相同的效果

    1>使用ReentrantLock类来进行锁的操作,实现了Lock接口
    lock():加锁
    unlock():解锁

    三、单例在多线程中的应用

    四、生产者与消费者设计模式
    1.对临界资源问题的应用
    它描述的是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者可以从仓库中取走产品,解决生产者消费者问题,我们需要做的就是保证生产者和消费者之间的同步

    同步问题的核心:常用的方式就是加锁,目的是为了保证在任意时刻资源只能被一个线程访问

    2.实现
    wait():当缓冲区已满或者为空的情况下,生产者/消费者停止自己的执行,放弃锁,使自己处于等待状态,让其他线程执行
    Object的方法
    调用方法:对象.wait()
    释放 对象 这个锁标记,然后再锁外面进行等待(sleep是持有锁进行休眠)
    必须放到同步代码段中执行


    notify():当生产者/消费者向缓冲区中放入/取走一个产品时,向其他等待的线程发出通知,同时使自己放弃锁,处于等待状态
    Object的方法
    调用方法:对象.notify()
    表示唤醒 对象 锁标记外面正在等待的一个线程


    notifyAll():全部唤醒
    调用方法:对象.notify()
    表示唤醒 对象 锁标记外面正在等待的所有线程



  • 相关阅读:
    python把汉字转换成拼音实现程序
    C#第三方zip解压压缩工具,带事例源码
    实现在线压缩文件的实现程序代码
    如何处理JSON中的特殊字符
    《汉字简体、繁体相互转换》 查看源代码
    中文字符转拼音源码
    upper_bound()函数使用方法
    CodeFroces New Assignment 二分图匹配
    选拔赛 hash 字符串匹配 哈希算法(白书p374)
    lower_bound()函数使用
  • 原文地址:https://www.cnblogs.com/lidar/p/7743285.html
Copyright © 2011-2022 走看看