其他分享
首页 > 其他分享> > synchronized关键字

synchronized关键字

作者:互联网

  一、synchronized对某个对象进行加索.

  object o =new object();

  synchronized(o){};任何线程要执行代码块里的代码必须拿到o的锁.

  synchronized(this);锁定当前对象.等同于synchronized的方法public synchronized void m(){};

  synchronized静态方法锁定的是synchronized(T.class) 类的class.T.class 在同一个classloader中是单例的.

  对象的markword上两位记录是否被锁定.

Ps:synchronized既保证了原子性,又保证了可见性.

 

  二、同步方法和非同步方法时候可以被同时调用?

  可以的,就像一个人在洗手,一个人在撒尿,互相不影响.

  三、synchronized可重入.

  可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class).

  synchronized和ReentrantLock都是可重入的 ,可重入降低了编程复杂性.

  ReentrantLock 和 synchronized 不一样,需要手动释放锁,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样.

 

  三、程序之中如果出现异常,默认情况下锁会被释放.这是别的线程会进入代码块,造成数据不一致.

 

  四、synchronized的底层实现

    jdk早期 重量级 每次都去os申请线程

    1.5之后改成有个锁升级的过程

    synchronized(object)

    第一个线程进来 是没有加索的,在markword上记录了线程的id  (偏向锁)

    如果产生线程争抢,升级为  (自旋锁)  一个线程被锁住,另一个线程自选  默认自旋10次

    如果10次还得不到锁升级为  (重量级锁)   去操作系统申请资源

    锁升级的过程中避免了用户态于内核态之间频繁的切换,效率要高.

 

什么时候用自旋锁?什么时候用重量级锁?

执行时间过长或者线程说过多用重量级锁. 自旋会占用cpu.

执行时间短(加索代码),线程少,用自旋锁.

 

    

标签:重入,synchronized,关键字,线程,自旋,重量级,class
来源: https://www.cnblogs.com/chen-xing-Eli/p/13155372.html