`
wen866595
  • 浏览: 267201 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

同步方法与同步代码块的区别

    博客分类:
  • java
阅读更多
当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNCHRONIZED标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。
同步化一个方法块会超过JVM对获取对象锁和异常处理的内置支持,要求以字节代码显式写入功能。如果使用同步方法读取一个方法的字节代码,就会看到有十几个额外的操作用于管理这个功能。
public class Sync {
	private int i;

    public synchronized int synchronizedMethodGet() {
        return i;
    }

    public int synchronizedBlockGet() {
        synchronized( this ) {
            return i;
        }
    }

}


反编译出的字节码:
D:\Java\jdk1.6.0_02\bin>javap -c Sync
Compiled from "Sync.java"

public class Sync extends java.lang.Object{
public Sync();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public synchronized int synchronizedMethodGet();
  Code:
   0:   aload_0
   1:   getfield        #2; //Field i:I
   4:   ireturn

public int synchronizedBlockGet();
  Code:
   0:   aload_0
   1:   dup
   2:   astore_1
   3:   monitorenter
   4:   aload_0
   5:   getfield        #2; //Field i:I
   8:   aload_1
   9:   monitorexit
   10:  ireturn
   11:  astore_2
   12:  aload_1
   13:  monitorexit
   14:  aload_2
   15:  athrow
  Exception table:
   from   to  target type
     4    10    11   any
    11    14    11   any

}





分享到:
评论

相关推荐

    java 中同步方法和同步代码块的区别详解

    - `methodC`的同步代码块锁对象是字符串`str`,与其他两个方法使用的锁对象不同,因此线程3可以独立于线程1和线程2执行`methodC`。 同步方法和同步代码块的主要区别在于锁的作用域: - **锁的作用范围**:同步方法...

    java中synchronized(同步代码块和同步方法)详解及区别

    本篇文章将详细介绍`synchronized`的两种形式:同步代码块和同步方法,并分析它们的区别。 1. **同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步...

    25.线程的同步机制-synchronized同步语句-使用同步代码块解决同步方法的弊端.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    同步代码块(synchronized).zip

    在这个例子中,`increment()`和`decrement()`方法都用到了同步代码块,使得计数操作不会因线程并发而出现不正确的结果。 通过这两个示例,我们可以学习到同步代码块在实际编程中的应用,以及如何解决多线程环境下的...

    【IT十八掌徐培成】Java基础第08天-03.多线程-同步代码块-同步方法.zip

    与同步代码块类似,同步方法也保证了同一时间只有一个线程可以执行该方法。 虽然同步可以保证数据一致性,但过度使用同步可能导致线程阻塞,降低程序的并发性能。因此,开发者需要根据实际需求合理使用同步,避免...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    当线程通过`synchronized`关键字进入同步代码块或同步方法时,它会获取对象的锁。如果锁已被其他线程持有,那么该线程将会被阻塞,直到锁被释放。锁的状态存储在对象头的Mark Word中,包括线程ID等信息。 三、同步...

    Java同步代码块和同步方法原理与应用案例详解

    本篇文章将深入探讨Java同步代码块和同步方法的原理及其在实际应用中的案例,以实现一个简单的买票系统为例。 首先,我们需要理解“原子性”这个概念。在多线程环境中,原子性意味着一段代码在执行过程中不会被其他...

    静态方法同步 与 非静态方法同步

    在Java中,同步是通过`synchronized`关键字实现的,它用于确保同一时间只有一个线程可以执行特定代码块。这有助于维护数据的完整性,特别是在多个线程可能同时修改同一对象的情况下。 1. 静态方法同步: 静态方法是...

    BlankKelly#ConcurrencyNote#Java同步代码块1

    synchronized关键字可以用来标识四种不同类型的块:- 实例方法- 静态方法- 实例方法中的代码块- 静态方法中的代码块同步实例方法public syn

    java 同步方法

    例如,清单2中将同步代码块外移,先进行线程安全的预处理,然后在同步块内仅执行关键操作,如从HashMap中获取值。 2. **使用并发工具**:Java提供了一些并发工具类,如`java.util.concurrent`包中的`Atomic`类、`...

    java使用datax增量同步代码

    总的来说,Java 使用 DataX 增量同步代码的优势在于高效、稳定和易扩展。它能帮助开发者快速构建起数据同步流程,同时提供灵活的配置选项以适应各种复杂的数据迁移需求。通过以上步骤,你可以将这个功能直接集成到你...

    java 多线程同步方法的实例

    当一个线程进入synchronized方法或代码块时,其他试图访问同一对象的线程会被阻塞,直到该线程执行完毕并释放锁。例如,`public synchronized void method()`就是一个同步方法。 2. **wait()、notify()和notifyAll...

    Java多线程-同步机制解决线程安全问题方式二:同步方法

    在案例2中,我们将`run()`方法中的整个循环体用`synchronized(this)`包裹,使整个循环成为同步代码块,这与将`show()`方法声明为同步方法的效果是一样的: ```java public void run() { while (true) { ...

    MQ同步代码

    MQ同步代码是实现应用程序之间消息传递的关键部分,尤其是在分布式系统中,它可以帮助处理高并发和异步处理的需求。 首先,我们要理解MQ的基本概念。MQ是一个消息传递系统,它提供了一个平台,使得应用程序可以发送...

    浅谈同步监视器之同步代码块、同步方法

    下面小编就为大家带来一篇浅谈同步监视器之同步代码块、同步方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    C#线程同步的几种方法

    `lock`语句提供了更强大的同步机制,它允许程序员锁定一个对象,确保同一时间只有一个线程可以进入锁定的代码块。这通常用于保护对共享资源的访问,防止并发修改引起的问题。 使用`lock`时应注意以下几点: - 锁...

    在同步代码结束后,使用ReleaseMutex(THandle

    在本节的例程中,我们只是要防止线程进入同步代码区域中,所以lpName参数设置为nil。 3、在同步代码前用WaitForSingleObject()函数。该函数使得线程取得互斥对象(同步代码)的拥有权。该函数定义为: DWORD ...

    30.线程的同步机制-synchronized同步语句-静态同步synchronized方法与synchronized(class)代码块.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java synchronize 线程同步

    在引申的例子中,通过定义一个静态的`lock`对象,然后在同步代码块中使用它,确保了所有线程在执行`execute()`方法时都会获取这把全局锁,从而实现了同步。 ```java public class TestThread { private static ...

Global site tag (gtag.js) - Google Analytics