多线程(二)--锁

一、线程的优先级
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方法。
posted @ 2019-04-02 11:48  千千万花世界  阅读(219)  评论(0编辑  收藏  举报