• 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 入门变量类型标识符和关键字
    对于msSql中exists操作符求值的疑惑
    那个蛋痛的list的remove_if中用到的对像函数
    继承一个虚类的时候要小心是,并使其实例化时.必须使其全实重写了纯虚的方法...类定义的位置
    MSSQL(TSQL)中的varchar不指定大小好像一般来说只有一个的长度
    关于TSQL中触发器的只言片语
    MSSQL十秒一次的job
    用了Rime输入法之后,发现IE要关闭保护模式才能输入
    三性原则,指的是商业银行的“安全性、流动性、效益性
    九选三
  • 原文地址:https://www.cnblogs.com/lidar/p/7743285.html
Copyright © 2020-2023  润新知