• 首页
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案
目录

锁代码块和锁方法有啥区别啊

锁代码块和锁方法的标准的说法应该是同步代码块和同步方法。区别是:1.写法;2. 锁的范围;3. 锁的类型。其中,同步代码块是写在方法中的;同步方法是通过关键字标识方法。

一、锁代码块和锁方法的区别

锁代码块和锁方法的标准的说法应该是同步代码块和同步方法。区别是:

1.写法

同步代码块是写在方法中的

同步方法是通过关键字标识方法

// 同步代码块

public void test2() {

    synchronized (锁) {

        // 代码

    }

}

// 同步方法

public synchronized void test1() {

    // 代码

}

2. 锁的范围

同步代码块的范围是它大括号所包含的所有代码

同步方法的范围是方法中的所有代码

3. 锁的类型

同步代码块使用的锁是可以自定义的,可以是任意的对应或者类(类本质也是传入的一个对象)

同步方法使用的锁是固定的,或者说是规定好的。

public class Test {

  public static void main(String[] args){

    Test t = new Test();

    t.test3();

  }

  // 使用当前类对象作为锁,在本例中就是使用 Test.class 作为锁

  public static synchronized void test1() {

  }

  // 等同于

  public void test2() {

    synchronized (Test.class) {

    }

  }

  // 使用 this 作为锁,在本例中就是使用对象 t 作为锁

  public synchronized void test3() {

  }

  // 等同于

  public void test4() {

    synchronized (this) {

    }

  }

}

延伸阅读:

二、Synchronized(this)锁代码块

用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待。这种情况下就可以使用synchronized同步该方法中会引起线程安全的那部分代码,其余不会引起线程安全的就不需要同步,这部分代码就可以多线程并发执行,减少时间提高效率。

举例:多线程执行同一个方法时,同步方法和同步代码块花费时间的比较

synchronized修饰方法(同步方法)

synchronized修饰longTimeTask方法,其中花费时间比较长的且与线程安全无关的是37-39行代码,会引起线程安全问题的是42-46。

以上就是关于锁代码块和锁方法有啥区别的内容希望对大家有帮助。

相关文章