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