java同步机制:使用synchronize block,还是使用synchronize method

今天在学习java原子类的时候,遇到了这篇博客,看到了同步代码块和同步方法的区别,之前没有意识到,这里记录下。

public class CP {

	private int i = 0;

	public synchronized int synchronizedMethodGet() {
		return i;
	}

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

从功能角度来说,上面两种方式没有差别,都能保证方法执行时候的原子性。从性能上来看,同步方法比同步代码块更有优势。我们使用JDK提供的javap命令,查看生成的字节码。

E:\code_space\test\bin>javap -c CP
Compiled from "CP.java"
public class CP {
  public CP();
    Code:
       0: aload_0
       1: invokespecial #10                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: iconst_0
       6: putfield      #12                 // Field i:I
       9: return

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

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

明显可以看到:使用同步代码块,产生的字节码数更多;而同步方法则很少。

时间: 2024-10-08 10:41:59

java同步机制:使用synchronize block,还是使用synchronize method的相关文章

Java同步机制总结--synchronized

不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话.JAVA中synchronized关键字能够 作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.假如再细的分类,synchronized可作用于instance变 量.object reference(对象引用).static函数和class literals(类名称字面常量)身上. 在进一步阐述之前,我们需要明确几点: A.无论synchronized关键字加在方法上还

java——同步机制(synchronized, volatile)

1. java的线程间通信是由java的内存模型(JMM)来控制的. JMM(java memory management) 定义了线程和主内存之间的抽象关系,一个是主内存(多线程之间来进行共享),一个是每个线程自己的私有内存 2. 为什么需要同步机制? (1) 同步机制一般发生在多线程中,当需要跨线程维护程序的正确性,当需要多个线程之间共享非final变量时,就必须使用同步机制来保证一个线程的操作对于另一个线程是可见的 (2) 同步机制保证了多个线程之间的可靠通信,保证了多个线程之间对共享变量

java同步机制对象锁使用方式比较

class Sync { private byte[] lock = new byte[0]; public void sync() throws InterruptedException { synchronized (lock) { runThread(); } } public void thisSync() throws InterruptedException { synchronized (this) { runThread(); } } public synchronized st

Java多线程-Java同步块

以下内容转自http://ifeve.com/synchronized-blocks/: Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例 Java 同步关键字(synchronized) Java中的同步块用synchronized标记.同步块在Java中是同步在某个对象上.所有同

Java同步块

原文:http://ifeve.com/synchronized-blocks/ Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例 Java 同步关键字(synchronized) Java中的同步块用synchronized标记.同步块在Java中是同步在某个对象上.所有同步在一个

【Java同步块】

原文链接 作者:Jakob Jenkov 译者:李同杰Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例 Java 同步关键字(synchronized) Java中的同步块用synchronized标记.同步块在Java中是同步在某个对象上.所有同步在一个对象上的同步块在同时只能被一

Java同步与异步

一.关键字: thread(线程).thread-safe(线程安全).intercurrent(并发的) synchronized(同步的).asynchronized(异步的). volatile(易变的).atomic(原子的).share(共享) 二.总结背景: 一次读写共享文件编写,嚯,好家伙,竟然揪出这些零碎而又是一路的知识点.于是乎,Google和翻阅了<Java参考大全>.<Effective Java Second Edition>,特此总结一下供日后工作学习参考

【总结】Java线程同步机制深刻阐述

原文:http://hxraid.iteye.com/blog/667437 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等. 当多个线程同时读写同一份共享资源的时候,可能会引起冲突.这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团. 同步这个词是从英文synchronize

java并发:线程同步机制之计数器&amp;Exechanger

第一节 CountDownLatch (1)初识CountDownLatch (2)详述CountDownLatch CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量.每当一个线程完成了自己的任务后,计数器的值就会减1,当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务. CountDownLatch中主要方法如下: public CountDownLatch(int count),构造函数中的count(计数器)实际上就