美文网首页
线程 3. 锁对象

线程 3. 锁对象

作者: 灰气球 | 来源:发表于2017-05-28 20:50 被阅读0次
  • 什么是锁对象?
    每个java对象都有一个锁对象.而且只有一把钥匙.
  • 如何创建锁对象:
    可以使用this关键字作为锁对象,也可以使用所在类的字节码文件对应的Class对象作为锁对象
    1. 类名.class

    2. 对象.getClass()

      • Java中的每个对象都有一个内置锁,只有当对象具有同步方法代码时,内置锁才会起作用,当进入一个同步的非静态方法时,就会自动获得与类的当前实例(this)相关的锁,该类的代码就是正在执行的代码。获得一个对象的锁也成为获取锁、锁定对象也可以称之为监视器来指我们正在获取的锁对象。
      • 因为一个对象只有一个锁,所有如果一个线程获得了这个锁,其他线程就不能获得了,直到这个线程释放(或者返回)锁。也就是说在锁释放之前,任何其他线程都不能进入同步代码(不可以进入该对象的任何同步方法)。释放锁指的是持有该锁的线程退出同步方法,此时,其他线程可以进入该对象上的同步方法。
      • 注意
        1. 只能同步方法(代码块),不能同步变量或者类
        2. 每个对象只有一个锁
        3. 不必同步类中的所有方法,类可以同时具有同步方法和非同步方法
        4. 如果两个线程要执行一个类中的一个同步方法,并且他们使用的是了类的同一个实例(对象)来调用方法,那么一次只有一个线程能够执行该方法,另一个线程需要等待,直到第一个线程完成方法调用,总结就是:一个线程获得了对象的锁,其他线程不可以进入该对象的同步方法。
        5. 如果类同时具有同步方法和非同步方法,那么多个线程仍然可以访问该类的非同步方法。
        6. 同步会影响性能(甚至死锁),优先考虑同步代码块。
        7. 如果线程进入sleep() 睡眠状态,该线程会继续持有锁,不会释放。
    3. 同步函数

      • 使用synchronized修饰该函数则称作为同步函数。
      • 同步函数要注意的事项:
        1. 非静态同步函数的锁对象是this对象,静态函数的锁对象是当前所属类的class文件对象。
        2. 同步函数的锁对象是固定的,无法更改。
  • 推荐使用: 同步代码块
  • 推荐的原因
    1. 同步代码块的锁对象可以由我们自己指定,同步函数的锁对象是固定 的。
    2. 同步代码块可以随意指定哪个范围需要被同步,而同步函数必须是整个函数都同步, 代码不灵活。

相关文章

  • 线程 3. 锁对象

    什么是锁对象?每个java对象都有一个锁对象.而且只有一把钥匙. 如何创建锁对象:可以使用this关键字作为锁对象...

  • 深入JVM内核原理-4.JVM锁

    1.JVM锁概要 JVM锁概要.png 2.线程安全 JVM线程安全1.pngJVM线程安全2.png 3.对象头...

  • synchronized和lock简单理解

    synchronized(同步锁) 思考:锁什么?锁对象 可能锁对象包括:this,临界资源对象(所有线程可能访问...

  • java内置锁synchronized的可重入性

    当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会...

  • 多线程同步

    多线程的同步依靠的是对象锁机制 加错锁(this)但是每个线程都持有this对象的对象锁 正确加锁外部创建共享资源...

  • 线程运用---等待通知的范式wait()、notify()

    1.等待线程获取到对象的锁,调用wait()方法,放弃锁,进入等待队列2.通知线程获取到对象的锁,调用对象的not...

  • sychronized的偏向锁,轻量级锁和重量级锁

    1.偏向锁:在锁对象的对象头中记录一下当前获取到该锁的线程ID,该线程如果再次获取该对象的的锁就可以直接获取锁(锁...

  • wait() notify() notifyAll()讲解

    1.锁池 等待池 每个对象都内置了锁池跟等待池。锁池: 某个线程拥有了该对象的锁,其他线程执行时,遇到该对象修饰的...

  • sleep()和wait()方法的区别

    sleep()睡眠时,保持对象锁,仍然占有该锁;其他线程无法访问 而wait()睡眠时,释放对象锁。其他线程可以访问

  • 锁对象的改变

    在前面学习完多线程的synchronized对象锁之后,不禁思考到,如果当某一线程获得某对象的对象锁后,在其内部锁...

网友评论

      本文标题:线程 3. 锁对象

      本文链接:https://www.haomeiwen.com/subject/qpihfxtx.html