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

Java多线程synchronized关键字

 
阅读更多

    Java中使用synchronized关键字来加锁达到同步的目的,synchronized可以在作用在方法上,也可以作用在代码块上。

Java中的每一个对象都可以作为锁,但是基本数量类型不行,如int、float。

 

synchronized同步非静态方法

    非静态同步方法,锁是当前对象实例,如下代码Info类中set()和get()方法都加上synchronized关键字同步,说明Info对象同一实例在同一时刻只能访问set()或get()方法:

public class Info {
	private String	country;
	private String	city;	
	public synchronized void set(String country, String city) {
		System.out.println("进入设置方法...");
		this.country = country;
		try {
			Thread.sleep(30000);
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
		this.city = city;
		System.out.println("完成设置...");
	}	
	public synchronized void get() {
		System.out.println("进入读取方法...");
		try {
			Thread.sleep(300);
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("country:" + this.country + "->city:" + this.city);
	}	
	public String getCountry() {
		return country;
	}	
	public void setCountry(String country) {
		this.country = country;
	}	
	public String getCity() {
		return city;
	}	
	public void setCity(String city) {
		this.city = city;
	}
}

 

synchronized同步静态方法

    同步静态方法,锁是当前类的Class对象。如Singleton单例模式在多线程下是不安全的,可以加synchronized关键字来同步,如下代码(此方法只为演示,在大多数情况下不需要同步,此方法性能不好):

	public static synchronized Singleton getInstance() {		
		if (instance == null) {
			instance = new Singleton();
		}		
		return instance;
	}

 如下面测试代码,由于静态方法的锁有当前类的,所以每一个getInstance()方法都是同步的,所以性能不高:

/**
 * Huisou.com Inc.
 * Copyright (c) 2011-2012 All Rights Reserved.
 */

package thread;

import java.util.Date;

/**
 * @description
 * 
 * @author chenzehe
 * @email hljuczh@163.com
 * @create 2012-12-4 下午05:33:21
 */

public class Singleton {
	private static Singleton	instance	= null;
	
	private Singleton() {
		
	}
	
	public static synchronized Singleton getInstance() {
		System.out.println("...get..." + new Date());
		if (instance == null) {
			instance = new Singleton();
		}
		try {
			Thread.sleep(3000);
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("...ret..." + new Date());
		return instance;
	}
	
}



/**
 * Huisou.com Inc.
 * Copyright (c) 2011-2012 All Rights Reserved.
 */

package thread;

import javax.xml.stream.events.StartDocument;

/**
 * @description
 * 
 * @author chenzehe
 * @email hljuczh@163.com
 * @create 2013-1-16 上午09:00:46
 */

public class SingletonTest {
	
	public static void main(String[] args) {
		new Thread() {
			public void run() {
				System.out.println("run get...");
				Singleton.getInstance();
			}
		}.start();
		new Thread() {
			public void run() {
				System.out.println("run get2...");
				Singleton.getInstance();
			}
		}.start();
	}
}

run get...
run get2...
...get...Wed Jan 16 09:20:12 CST 2013
...ret...Wed Jan 16 09:20:15 CST 2013
...get...Wed Jan 16 09:20:15 CST 2013
...ret...Wed Jan 16 09:20:18 CST 2013

 相对好点的多线程单例模式代码如下(懒汉模式):

	public static Singleton getInstance() {
		if (instance == null) {
			synchronized (Singleton.class) {
				if (instance == null) {
					instance = new Singleton();
				}
			}
		}
		return instance;
	}

 

 

synchronized关键字不能继承

      如果在父类中的某个方法使用了synchronized 关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上 synchronized 关键字才可以。 还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的, 但子类调用了父类的同步方法,因此,子类的方法中调用父类方法后面的代码也就相当于同步了。

 

接口的定义不能使用 synchronized关键字

 

构造方法不能使用 synchronized关键字

 

synchronized关键字可以放在方法访问修饰前面或后面,也可以放在static前面或后面,但是只能放在返回值前面,不能放在返回值后面,如下是正确的:

public synchronized void method();

synchronized public void method();

public static synchronized void method();

public synchronized static void method();

synchronized public static void method();

下面是错误的:

public void synchronized method();

public static void synchronized method();

 

使用synchronized同步代码块

   synchronized块的语法:

public void method(){
    ......
    synchronized (锁对象){
        ....
    }
    ....
}

    这样synchronized中的代码就会被加锁,锁对象为任意Java对象,对于非静态方法,锁对象一般为当前对象,可能用this关键字表示,对于内部类,this只表示当前内部类对象,可以使用外部类.this来表示,对于静态方法,锁对象一般使用类.class来表示,只有锁对象为同一对象时方法才会被同步,即使是在不同象中的同步方法,如果锁对象为同一对象,该同步方法也会被同步。

 

synchronized不能用来同步变量,如下代码是错误的:

public synchronized int i=0;

 

synchronized深入内容文章:聊聊并发(二)——Java SE1.6中的Synchronized

 

 

 

分享到:
评论

相关推荐

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

    总结来说,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了线程安全和数据一致性。然而,正确理解和使用它是至关重要的,避免滥用并结合其他并发控制手段,才能编写出高效且健壮的多线程程序。在实际...

    java多线程中synchronized关键字的用法

    java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com

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

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以避免数据不一致和竞态条件。在这个问题中,我们将深入理解`synchronized`的关键字用法,包括同步方法和同步块。 1. **...

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

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

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

    在这个方法中,synchronized 关键字锁住了整个类,这样可以确保多线程环境下的线程平安。 synchronized 关键字是 Java 中解决线程同步问题的重要工具,但是需要正确的用法,否则将无法实现线程平安。在编写代码时,...

    java同步synchronized关键字用法示例

    Java中的`synchronized`...总之,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了共享资源的安全访问,避免了竞态条件和数据不一致。理解和熟练运用`synchronized`对于编写健壮的并发程序至关重要。

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

    在多线程编程中,确保线程安全是至关重要的。Java提供了多种机制来处理并发问题,其中synchronized...通过深入理解synchronized关键字,开发者可以更好地处理Java中的并发问题,构建出更加健壮和高效的多线程应用程序。

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

    "Java 多线程与并发(4-26)-关键字- synchronized详解" Java 多线程与并发中的 synchronized 关键字是实现同步块的互斥访问和线程的阻塞及唤醒等工作的重要工具。下面将对 synchronized 关键字进行详细分析。 ...

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

    本教程将深入讲解`synchronized`关键字及其在Java多线程中的应用。 一、synchronized关键字的作用与原理 `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时...

    深入讲解java线程与synchronized关键字

    Java中的多线程同步是通过对象锁机制来实现的,synchronized关键字正是这一机制的关键。它确保了在任何时刻,只有一个线程能够访问特定的共享资源,从而避免数据不一致的问题。本文将详细讲解Java线程的基本概念、...

    深入理解java中的synchronized关键字

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

    Java并发-Synchronized关键字.docx

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

    java 多线程synchronized互斥锁demo

    标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...

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

    在Java编程中,`synchronized`关键字是用来解决多线程环境下的线程安全问题的关键工具。线程安全意味着当多个线程访问同一段代码时,该代码能够正确地处理并发情况,不会出现数据不一致或者资源竞争的问题。本文将...

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

    文章首先讨论了多线程编程中临界资源的概念,包括对象、变量、文件等,以及同步机制的必要性。重点解析了synchronized的工作原理,包括其底层原理、Monitor监视器锁的工作方式,以及Java对象的内存布局。文中详细...

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

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

    synchronized关键字的用法详解

    通过上述分析可以看出,`synchronized`关键字是Java多线程编程中不可或缺的一部分。它不仅提供了一种简单有效的同步机制,还具备自动解锁和可重入等高级特性,使得开发人员能够轻松地编写出高效且可靠的多线程程序。...

    java里面synchronized用法.doc

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

    Java多线程同步.pdf

    Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用synchronized关键字还不能...

Global site tag (gtag.js) - Google Analytics