synchronized与static synchronized

概述
我们可能对synchronized了解,对static也不陌生(Java static关键字),但是对两者的结合 static synchronized可能不太了解。在一些面试中,会问及synchronized与static synchronized的区别

区别
synchronized关键字
synchronized作用是对类的当前实例(对象)加锁。可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁(Java 并发编程)。

synchronized代码块【synchronized(synObject)】使用起来比synchronized方法要灵活得多。因为也许一个方法中只有一部分代码只需要同步,如果此时对整个方法用synchronized进行同步,会影响程序执行效率。而使用synchronized代码块就可以避免这个问题(同步对象或类属性),synchronized代码块可以实现只对需要同步的地方进行同步。

与Lock的区别:

  1. synchronized是Java语言的关键字,因此是内置特性,Lock是一个类(java.util.concurrent.locks包),通过这个类可以实现同步访问;
  2. synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用。Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。

static synchronized:
每个类有一个锁,它可以用来控制对static数据成员的并发访问。访问static synchronized方法占用的是类锁,而访问非static synchronized方法占用的是对象锁。

static synchronized控制类的所有实例(对象)的访问(相应代码块)。synchronized相当于 this.synchronized,static synchronized相当于Something.synchronized

代码解析:

package com.xianggen.concurrent;
/**

  • static synchronized 和synchronized的区别!

  • 关键是区别第四种情况!

  • @author xianggen

  • @2016年9月3日 上午11:49:39
    */
    public class StaticSynchronized {

    /**

    • synchronized方法
      */
      public synchronized void isSynA(){
      System.out.println(“isSynA”);
      }
      public synchronized void isSynB(){
      System.out.println(“isSynB”);
      }

    /**

    • static synchronized方法
      */
      public static synchronized void cSynA(){
      System.out.println(“cSynA”);
      }
      public static synchronized void cSynB(){
      System.out.println(“cSynB”);
      }

    public static void main(String[] args) {
    StaticSynchronized x=new StaticSynchronized();
    StaticSynchronized y=new StaticSynchronized();
    /**
    * x.isSynA()与x.isSynB() :不能同时访问(同一个对象访问synchronized方法)
    * x.isSynA()与y.isSynB() :能同时访问(不同对象访问synchronized方法)
    * x.cSynA()与y.cSynB() :不能同时访问(不同对象也不能访问static synchronized方法)
    * x.isSynA()与y.cSynA() :能同时访问(static synchronized方法占用的是类锁,而访问
    * synchronized方法占用的是对象锁,不存在互斥现象)
    */
    }

}

作者:Xiang-Gen
来源:CSDN
原文:https://blog.csdn.net/u012440687/article/details/52402973
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值