多线程(二)--锁
一、线程的优先级
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方法。