synchronized锁定的到底是什么?
回答·7
最热
最新
- synchronized 锁定的是一个个对象,实现的方式是在对象头上做出标记,表示这个对象上锁了,是哪个线程持有的锁以及当前使用的是什么锁方式(1.8 以后)。 其实可以从 synchronized 使用上去推导出在哪锁定的,使用 synchronized 可以直接放到静态方法,非静态方法,代码块三种方式,其中使用代码块的时候需要你设定一个对象用来锁,这里其实就能看出来 synchronized 上锁的时候需要一个对象。 而用在静态方法和非静态方法时分别锁在这个类的 class 文件上个当前对象上。 以上就是我对于 synchronized 锁在哪的基本理解,关于底层的实现有印象但是记不住了。
- 共享对象或当前对象。
- 以同一个 jvm 中,固定对象作为某个共享资源的使用权。这个固定对象头标记着使用权归属于哪个线程,同时也记录着其他线程将以什么方式来争抢这个使用权。而使用权所记录的信息,由 synchronized 关键字来修改。
- 对于实例同步方法,锁是当前实例对象 对于静态同步方法,锁是当前对象的 Class 对象 对于同步方法块,锁是 Synchonized 括号里配置的东西 实例对象和 class 都能锁 再下层 cpu 来来说锁的是缓存,比如 inter,阻止 StoreLoad,其他 cpu 有的有不同的指令实现,如果缓存行里内存没对齐不是原子指令的话就升级到锁总线。
- 这个东西要从对象组成来说,所谓的锁其实只是叫法,实际上是一套对象访问机制,对象的访问其实有一些列的拦截器一样的流程,比如对象头上的 monitor,计数器,持有者信息等,锁的意思就是开启了这些拦截器。 平常的对象访问可以理解为这些拦截器被禁用了
- 静态方法(类方法) 给静态方法添加 synchronized 关键字后,该类的被 synchronized 标识的静态方法一次只能被一个线程调用(获得锁),调用期间(占用锁)其它线程不允许调用被 synchronized 标识的静态方法(未获得锁),而没有添加 synchronized 关键字的静态方法(没有锁)可以被多个线程随时随意调用。 非静态方法 给非静态方法添加 synchronized 关键字后,该类的实例对象的被 synchronized 标识的非静态方法一次只能被一个线程调用(获得锁),调用期间(占用锁)其它线程不允许调用被 synchronized 标识的非静态方法(未获得锁),而没有添加 synchronized 关键字的非静态方法(没有锁)可以被多个线程随时随意调用。 被 synchronized 修饰的代码块锁的是传入的 Object 对象,当一个线程获得此锁后,在执行被修饰代码块的过程中,其它线程无法执行该代码块,待获得锁后才能执行该代码块。
- synchronized真正的底层(计算机的底层),实际上是汇编指令,锁的是北桥信号。。。。