`

java同步机制及synchronized关键字的应用2

 
阅读更多

类定义:

 

public class Test{
  public synchronized method1(){...}
  public synchronized method2(){...}
}

 

问题:

 

多线程并发访问method1和method2时,两者会互斥吗?

 

下面的测试程序来回答这个问题。

public class TestSynchronizedMethod {
	
	private void ivkMethod1(){
		Thread thread1 = new Thread() {
			public void run() {
				for(int i = 0; i < 20; i++) {
					//System.out.println("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
					//System.out.println("~~~~ start thread method1 ");
					method1();
					//System.out.println("~~~~ end   thread method1 ");
				}
			}
		};
		
		thread1.start();
	}
	
	private void ivkMethod2(){
		Thread thread2 = new Thread() {
			public void run() {
				for(int i = 0; i < 20; i++) {
					//System.out.println("\n\n#################################################");
					//System.out.println("#### start thread method2 ");
					method2();
					//System.out.println("#### end   thread method2 ");
				}
			}
		};	
		
		thread2.start();
	}
	
	
	
	
	private synchronized void method1(){
		System.out.println("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("~~~~ enter method1");
		
		try{
			System.out.println("~~~~ method1 begin to sleep 10s");
			Thread.sleep(10000);
		}catch(Exception e){
			e.printStackTrace();
		}
		System.out.println("~~~~ method1 end sleep");
	}
	
	private synchronized void method2(){
		System.out.println("\n\n#################################################");
		System.out.println("#### enter method2");
		
		try{
			System.out.println("#### method2 begin to sleep 3s");
			Thread.sleep(3000);
		}catch(Exception e){
			e.printStackTrace();
		}
		System.out.println("#### method2 end sleep");
	}	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TestSynchronizedMethod obj = new TestSynchronizedMethod();
			obj.ivkMethod1();
			obj.ivkMethod2();
			
		} catch (Exception e) {
			e.printStackTrace();
			
		} catch (Error er) {
			er.printStackTrace();
		}

	}

}

 

结论很明显,无需多言。究其原因,method1和method2所持的锁为obj实例锁,所以当对同一obj调用两个方法时,两者不能并发执行。编码时要注意这一点,这种情况下对象的并发能力比较差,可参考下java.util.Vector的get和set方法,就很容易理解为什么JDK新版本中提供了替代的List接口了。

 

5
3
分享到:
评论
5 楼 zengyan2012 2013-03-27  
charles751 写道
vani2013 写道
简单的说锁的是对象,而不是方法.

是的。



请问下以下代码有什么区别?
private void method3(){
    Integer i = new Integer();
    synchronized(i){
        //......  //这里是不可以理解为 只有这个方法被同步了,这个类的其他方法都是可以被其他线程同时调用并且运行的?
  }
}

private Integer i = 1;
private void method4(){
   synchronized(i){
        //.....
    }
}


private static Integer i = 1;
private static void method5(){
   synchronized(i){
        //.....
    }
}

private static Integer i = 1;
private void method6(){
   synchronized(类.i){
        //.....
    }
}
4 楼 charles751 2013-03-26  
vani2013 写道
简单的说锁的是对象,而不是方法.

是的。
3 楼 vani2013 2013-03-26  
简单的说锁的是对象,而不是方法.
2 楼 charles751 2013-03-26  
zengyan2012 写道


究其原因,method1和method2所持的锁为obj实例锁


是不是可以这么理解:
private synchronized void method2{

}
其实跟
private  void method2{
     synchronized(this){

   }
}

是一样的效果?


同意!
1 楼 zengyan2012 2013-03-26  


究其原因,method1和method2所持的锁为obj实例锁


是不是可以这么理解:
private synchronized void method2{

}
其实跟
private  void method2{
     synchronized(this){

   }
}

是一样的效果?

相关推荐

    java的线程同步机制synchronized关键字的理解_.docx

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    java同步synchronized关键字用法示例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...

    深入理解Java中的synchronized关键字:同步机制与应用

    Java提供了多种机制来处理并发问题,其中synchronized关键字是最基本也是最常用的同步手段之一。本文将深入探讨synchronized关键字的工作原理、使用方式以及在实际编程中的应用。 synchronized关键字是Java中实现...

    java基本教程之synchronized关键字java多

    一、synchronized关键字的作用与原理 `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时执行同一段代码,可能导致的数据不一致问题。 1. 同步方法:当在方法...

    Java并发编程:Synchronized关键字深度解析

    本文深入探讨了Java中用于解决并发...通过对synchronized关键字的深入分析,本文为Java开发者提供了对并发编程中关键同步工具的全面理解,特别是在高并发场景下如何有效使用synchronized以确保线程安全和提高程序性能。

    【Java并发编程】Synchronized关键字实现原理.doc

    Synchronized 关键字是 Java 并发编程中最基本的同步机制,它可以保证线程安全,包括原子性、可见性和有序性。Synchronized 关键字可以修饰方法或代码块,使得在同一时刻只有一个线程可以执行该方法或代码块,从而...

    实例解析Java中的synchronized关键字与线程平安问题_.docx

    在 Java 中,synchronized 关键字是一个非常重要的概念,它用于解决线程同步问题。但是,很多开发者对 synchronized 关键字的理解并不够深入,本文将通过实例解析 Java 中的 synchronized 关键字与线程平安问题,...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    Java 多线程与并发中的 synchronized 关键字是实现同步块的互斥访问和线程的阻塞及唤醒等工作的重要工具。下面将对 synchronized 关键字进行详细分析。 synchronized 关键字的使用场景 synchronized 关键字可以...

    Java中的同步机制:深入理解synchronized关键字

    synchronized关键字是Java中实现线程同步的基本工具,它通过锁定对象的monitor来控制对共享资源的并发访问。理解synchronized的工作原理和使用方式对于编写线程安全的Java程序至关重要。然而,由于其局限性,开发者...

    synchronized关键字的用法详解

    ### synchronized关键字的深入解析 #### 一、synchronized关键字的重要性 `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多...

    深入理解java中的synchronized关键字

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够保持数据的一致性和完整性。本文将深入探讨`synchronized`的两种主要用法:synchronized方法和...

    Java并发-Synchronized关键字.docx

    本文将探讨Synchronized关键字在解决并发控制中的作用及其使用方式。 首先,让我们回顾一下问题的背景:在给出的示例代码中,创建了10个线程,每个线程都对共享变量`count`进行10000000次的累加操作。理论上,最终...

    java synchronized关键字原理、自定义一把锁来实现同步等

    `synchronized` 是 Java 中的关键字之一,用于实现线程间的同步控制,确保共享资源的安全访问。它主要应用于以下两种场景: 1. **同步方法**:在类的方法声明前加上 `synchronized` 关键字,则该方法成为同步方法。...

    java里面synchronized用法.doc

    Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized 用法进行详细的解释和分析。 一、...

    synchronized关键字的实质及用法

    《深入理解Java中的synchronized关键字》 在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要工具,它的本质在于确保多线程环境下的数据一致性与安全性。通过`synchronized`,我们可以控制对共享资源...

    Java同步机制浅谈

    #### synchronized关键字的作用及应用 在Java多线程环境中,`synchronized`关键字扮演着至关重要的角色。它可以帮助开发者确保多线程环境下的数据一致性,防止因并发访问导致的数据错误。本篇文章将深入探讨`...

    Java多线程synchronized关键字详解(六)共5

    在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了在多线程环境中的数据一致性与安全性。本篇将详细解析`synchronized`的关键特性和使用方法,帮助开发者深入理解如何在并发编程中有效...

    【ASP.NET编程知识】实例解析Java中的synchronized关键字与线程安全问题.docx

    2. **synchronized 方法**:当`synchronized`关键字应用于方法时,整个方法体被视为同步代码块,作用对象是调用该方法的对象。对于非静态方法,锁住的是实例对象;对于静态方法,锁住的是类的Class对象,即全局锁。 ...

    Java synchronized关键字使用方式及特性解析

    此外,synchronized关键字也可以与其他线程同步工具结合使用,以实现更复杂的线程同步机制。 synchronized关键字是Java中实现线程同步的重要工具,它可以帮助开发者更好地控制线程的执行顺序,避免线程安全问题的...

Global site tag (gtag.js) - Google Analytics