美文网首页
JUC(十) - 线程八锁

JUC(十) - 线程八锁

作者: 21号新秀_邓肯 | 来源:发表于2020-05-18 15:59 被阅读0次

10. 线程八锁

  • 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法
  • 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法
  • 加个普通方法后发现和同步锁无关
  • 换成两个对象后,不是同一把锁了,情况立刻变化。
  • 都换成静态同步方法后,情况又变化
  • 所有的非静态同步方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。
  • 所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!
class Number{
    
    public static synchronized void getOne(){//Number.class
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
        }
        
        System.out.println("one");
    }
    
    public synchronized void getTwo(){//this
        System.out.println("two");
    }
    
    public void getThree(){
        System.out.println("three");
    }
    
}

测试

    public static void main(String[] args) {
        Number number = new Number();
        Number number2 = new Number();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                number.getOne();
            } 
        }).start();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
//              number.getTwo();
                number2.getTwo();
            }
        }).start();
        
        /*new Thread(new Runnable() {
            @Override
            public void run() {
                number.getThree();
            }
        }).start();*/
        
    }
  1. 两个普通同步方法,两个线程,标准打印, 打印? //one two
  2. 新增 Thread.sleep() 给 getOne() ,打印? //one two
  3. 新增普通方法 getThree() , 打印? //three one two
  4. 两个普通同步方法,两个 Number 对象,打印? //two one
  5. 修改 getOne() 为静态同步方法,打印? //two one
  6. 修改两个方法均为静态同步方法,一个 Number 对象? //one two
  7. 一个静态同步方法,一个非静态同步方法,两个 Number 对象? //two one
  8. 两个静态同步方法,两个 Number 对象? //one two

线程八锁的关键:

①非静态方法的锁默认为 this, 静态方法的锁为 对应的 Class 实例

②某一个时刻内,只能有一个线程持有锁,无论几个方法。

相关文章

  • JUC(十) - 线程八锁

    10. 线程八锁 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个s...

  • JUC线程高级---读写锁和线程八锁

    **版权声明:本文为小斑马伟原创文章,转载请注明出处! ReadWriteLock 读取操作通常不会改变共享资源,...

  • 2018-07-26 CountDownLatch

    【转】Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

  • Condition 源码分析 (基于Java 8)

    1. Condition 定义 Condition是JUC里面提供于控制线程释放锁, 然后进行等待其他获取锁的线程...

  • Condition原理和源码解析

    Condition 定义Condition是JUC里面提供于控制线程释放锁, 然后进行等待其他获取锁的线程发送 s...

  • Condition源码解析

    Condition是JUC里面提供于控制线程释放锁, 然后进行等待其他获取锁的线程发送 signal 信号来进行唤...

  • JUC源码循序渐进

    目录 必读篇 JUC源码分析—CAS和Unsafe JUC源码分析—AQS JUC锁篇 JUC源码分析-JUC锁(...

  • 多线程juc锁

    java_basic 1 线程安全 在Java多线程编程当中,实现线程安全: 内部锁(Synchronized...

  • juc-locks

    juc-locks 锁框架 java提供各类锁的一个框架 锁的性质划分 多个线程是否按顺序获取锁的角度划分--公平...

  • JUC学习笔记三

    JUC学习笔记三 用于解决多线程同步问题的方式 隐式锁(synchronized) 同步代码块 同步方法 显式锁(...

网友评论

      本文标题:JUC(十) - 线程八锁

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