zoukankan      html  css  js  c++  java
  • 多线程(二)--锁

    一、线程的优先级
    1.线程优先级分为1-10(低-高),通过代码自行调控
    2.默认优先级为5,一般可以通过静态变量设置一个最大优先级与最小优先级。
    3.优先级只会影响就绪状态的顺序,不会影响运行状态的线程,即高优先级不会把正在运行的低优先级的线程代替。
    4.通过setProirity()与getProirity()方法来设置与获取当前线程的优先级
     
    二、锁的意义
         在多线程中,存在一些资源是共享的,我们将这些资源称为共享资源。而在同一时间,多个线程同时操作该共享资源,可能会使该资源收到影响,甚至得到的资源本身的改变与我们的初衷相违背。所以在Java中,使用锁来控制共享资源,保证事物操作时,只会有一个线程对该资源进行操作。
     
    三、synchronized关键字
          1.作为锁的关键字,使用悲观锁设计。即认为资源被访问时,极有可能被修改。所以当公共资
             源需要在多线程中使用时,将资源锁住,即同一时间某资源只能被一个线程拥有。在保证安
             全的同时,也牺牲了效率。
          2.synchronized可以修饰方法,该方法具备同步性,在多线程中使用时不要手动添加同步操作。
          3.synchronized修饰代码块时,选择一个Object对象作为锁,获取锁的线程可以运行。不具备
             锁的则陷入等待。
          4.拥有锁的线程,当运行完锁内代码块时,会释放锁。当代码块中,陷入错误时,JVM会自动
             释放该锁,Synchronized具备异常机制,所以不需要手动添加锁
          5.缺点:在具备方便使用的同时,也需要牺牲掉灵活性,与其说Synchronized与lock是两个不同的东西,不如说Synchronized是lock的一种固定的实现,是一个采用悲观锁的加入了异常处理机制以及释放锁的lock,当然事实并非如此。
    四、object中的wait()与notify()方法
          1.当存在同步操作时,则可以开始使用notify与wait方法,且wait方法必须与notify与notifyall方法
          2.结合使用。
          3.wait:用于将同步操作中当前线程的锁释放,释放锁与cpu资源,使线程进入阻塞状态。
          4.notify:释放资源唤醒,需要改资源的等待的线程(被wait阻塞的线程)。
          5.可使用一个没有意义的object类作为锁。
    五、lock类
        1.lock作为一个类而非关键字,功能比synchronized强大,但操作较为复杂。
        2.lock是一个接口,而实现了Lock接口的类只有ReentrantLock,当然也可以直接实例化该接口,不过需要实现所有的抽象方法。
        3.lock不会主动释放锁,需要手动调用unlock方法释放锁。且lock不会因为异常的发生释放锁。
           所以lock需要结合try catch finally使用,并且在finally中释放锁。
        4.trylock():尝试获取锁,如果可以获取到锁时,返回true,如果无法获得锁则返回false。只
          会尝试一次获取锁,如果没有则返回,不会一直等待锁。也可以设置时间来控制
           try(Long time ,TimeUnit timeunit)会在一定时间内尝试获得锁,如果不能则false。
    5.lockinterruptable():中断lock方法。
  • 相关阅读:
    DAY9学习笔记
    DAY8课下作业
    DAY8学习笔记
    DAY7课下作业
    github clone 开源代码报Permission denied (publickey)
    grandle构建工程报:javax.net.ssl.SSLException
    centos安装redash
    centos安装nodejs
    CURL执行请求
    flume定制拦截器Interceptor
  • 原文地址:https://www.cnblogs.com/qqwhsj/p/10641721.html
Copyright © 2011-2022 走看看