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()
    表示唤醒 对象 锁标记外面正在等待的所有线程



  • 相关阅读:
    自定义的弹出框列表适配器,类似于大众点评或美团
    Android 微信支付&支付宝支付
    动态设置 view 在布局中位置
    android 之图片异步加载
    android 侧滑菜单
    Google 官方 侧滑 drawerlayout
    python D27网络传输协议
    计算机单位换算、以及sort、sorted函数的区别
    python D26 socket、网络整个通信流程
    python D25 包
  • 原文地址:https://www.cnblogs.com/lidar/p/7743285.html
Copyright © 2011-2022 走看看