多线程--锁

Posted qqwhsj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程--锁相关的知识,希望对你有一定的参考价值。

一、线程的优先级
1.线程优先级分为1-10(低-高),通过代码自行调控
2.默认优先级为5,一般可以通过静态变量设置一个最大优先级与最小优先级。
3.优先级只会影响就绪状态的顺序,不会影响运行状态的线程,即高优先级不会把正在运行的低优先级的线程代替。
4.通过setProirity()与getProirity()方法来设置与获取当前线程的优先级
 
二、锁的意义
     在多线程中,存在一些资源是共享的,我们将这些资源称为共享资源。而在同一时间,多个线程同时操作该共享资源,可能会使该资源收到影响,甚至得到的资源本身的改变与我们的初衷相违背。所以在Java中,使用锁来控制共享资源,保证事物操作时,只会有一个线程对该资源进行操作。
 
三、synchronized关键字
      1.作为锁的关键字,使用悲观锁设计。即认为资源被访问时,极有可能被修改。所以当公共资
         源需要在多线程中使用时,将资源锁住,即同一时间某资源只能被一个线程拥有。在保证安
         全的同时,也牺牲了效率。
      2.synchronized可以修饰方法,该方法具备同步性,在多线程中使用时不要手动添加同步操作。
      3.synchronized修饰代码块时,选择一个Object对象作为锁,获取锁的线程可以运行。不具备
         锁的则陷入等待。
      4.拥有锁的线程,当运行完锁内代码块时,会释放锁。当代码块中,陷入错误时,JVM会自动
         释放该锁,所以注意添加异常机制。
      5.缺点:如果该线程同时需要其他的资源,且陷入等待。资源却不释放,会让其他需要该资源
        的线程同时陷入等待。甚至存在两个线程分别需要两种资源,且各持有一种资源,则会陷入死
        锁状态。
 
 
四、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中的方法。
    3.lock不会主动释放锁,需要手动调用unlock方法释放锁。且lock不会因为异常的发生释放锁。
       所以lock需要结合try catch finally使用,并且在finally中释放锁。
    4.trylock():尝试获取锁,如果可以获取到锁时,返回true,如果无法获得锁则返回false。只
      会尝试一次获取锁,如果没有则返回,不会一直等待锁。也可以设置时间来控制
       try(Long time ,TimeUnit timeunit)会在一定时间内尝试获得锁,如果不能则false

以上是关于多线程--锁的主要内容,如果未能解决你的问题,请参考以下文章

synchronized锁多线程同步的原理是咋样的?

无锁多线程编程初步(基础部分)

并发编程之多线程

《C++多线程编程》学习笔记

多线程加锁#yyds干货盘点#

iOS - 多线程的锁