`
liulanghan110
  • 浏览: 1077868 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

synchronized

    博客分类:
  • JAVA
阅读更多

synchronized 关键字的作用一个词概括就是:线程同步。它可以将将对象或者Class加锁,用来防止两个线程同时访问一个数据。

 

看如下代码:

 

package com.test.runnable;

public class DoSomething implements Runnable{
	private String name;
	
	public DoSomething(String name){
		this.name = name;
	}

	public void run(){
		for(int i = 0; i < 5;i++){
				System.out.println(name+":"+i);
		}
		
	}
}

 

package com.test.runnable;


public class TestRunnable {
	public static void main(String argc[]){
		DoSomething ds1 = new DoSomething("张三");
		DoSomething ds2 = new DoSomething("李四");
		Thread t1 = new Thread(ds1);
		Thread t2 = new Thread(ds2);
		t1.start();
		t2.start();
	}
}

 输出结果为:

张三:0

李四:0

张三:1

李四:1

张三:2

张三:3

张三:4

李四:2

李四:3

李四:4

可以发现并不是张三输出完了再输出李四。

然后给输出的语句块加上synchronized 关键字,如下:

 

package com.test.runnable;

public class DoSomething implements Runnable{
	private String name;
	
	public DoSomething(String name){
		this.name = name;
	}

	public void run(){
		synchronized(this){
			for(int i = 0; i < 5;i++){
				System.out.println(name+":"+i);
			}
		}
	}
}

 

 

但发现,再次运行发现还是乱序,原因是synchronized(this)获得的是对象锁,t1运行时获得的是ds1对象的锁,t2运行时获得的是ds2的对象锁,两个互不干扰,所以此时synchronized无效。要时synchronized有效,可以将代码改成如下:

 

package com.test.runnable;


public class TestRunnable {
	public static void main(String argc[]){
		DoSomething ds1 = new DoSomething("张三");
		DoSomething ds2 = new DoSomething("李四");
		Thread t1 = new Thread(ds1);
		Thread t2 = new Thread(ds1);
		t1.start();
		t2.start();
	}
}

 

也可以将锁的范围由对象改为类,这样t1运行时获得的是DoSomething.class的锁,t2运行时再获得 DoSomething.class的锁时发现不能获得,等待t1的synchronized块运行完释放锁时才能得到。代码如下:

package com.test.runnable;

public class DoSomething implements Runnable{
	private String name;
	
	public DoSomething(String name){
		this.name = name;
	}

	public void run(){
		synchronized(DoSomething.class){
			for(int i = 0; i < 5;i++){
				System.out.println(name+":"+i);
			}
		}
	}
}

 

当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其他synchronized(this)同步代码块得访问将被阻塞。

 

看如下代码:

package com.test.runnable;

public class DoSomething implements Runnable{
	private String name;

	
	public DoSomething(String name){
		this.name = name;
	}
	
	public void doA(){
		synchronized(this){
			for(int i = 0; i < 5;i++){
				System.out.println("做A事情:"+name+":"+i);
			}
		}
	}

	public void doB(){
		synchronized(this){
			for(int i = 0; i < 5;i++){
				System.out.println("做B事情:"+name+":"+i);
			}
		}
	}
	public void run(){
		doA();
		doB();
	}
}

 

package com.test.runnable;


public class TestRunnable {
	public static void main(String argc[]){
		DoSomething ds1 = new DoSomething("张三");
		Thread t1 = new Thread(ds1);
		Thread t2 = new Thread(ds1);
		t1.start();
		t2.start();
	}
}

 当t1运行到doB时,理论上doA已经解锁了。这时t2可以运行doA代码。但实际上,由于t1此时对象锁还没释放,t2也不能获得对象锁,也不能运行doA的代码。只能等t1运行完doB释放对象锁了,t2才能开始运行doA

 

 

                

 

 

  • 大小: 13.8 KB
0
1
分享到:
评论
1 楼 hzieept 2014-08-22  
我给博主总结一下。
本文实验了 synchronized method, synchronized object, synchronized class 的区别。

相关推荐

    java_synchronized详解

    ### Java synchronized 关键字详解 #### 一、synchronized关键字简介 `synchronized`是Java语言提供的关键字之一,用于实现线程间的同步控制。通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个...

    java中synchronized用法

    "Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...

    java里面synchronized用法.doc

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

    Android synchronized 测试案例

    在Android开发中,`synchronized`关键字是Java语言中用于实现线程同步的重要工具,它在多线程环境下确保了共享资源的安全访问。本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及...

    Java synchronized使用案例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...

    synchronized的几种示例

    在Java编程语言中,`synchronized`关键字是一个重要的并发控制机制,用于确保多线程环境下的数据一致性。本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法...

    volatile和synchronized的区别

    ### volatile与synchronized的区别 #### 一、锁的特性:互斥与可见性 在并发编程中,锁作为实现线程安全的一种手段,其核心作用在于提供两种特性:互斥和可见性。 - **互斥**:互斥是指在任何时刻,只允许一个...

    java锁机制Synchronizedjava锁机制Synchronized

    "Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...

    synchronized用法大全实例

    在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于实现线程间的同步,以确保共享资源的安全访问。本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ##...

    synchronized并发讲解源码.zip

    在Java编程语言中,`synchronized`关键字是一个非常重要的并发控制机制,用于保证多线程环境下的数据一致性。本文将深入解析`synchronized`的工作原理、使用方式以及它在并发编程中的重要性。通过分析提供的源码,...

    java同步synchronized关键字用法示例

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

    synchronized关键字的用法详解

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

    synchronized关键字的实质及用法

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

    Synchronized关键字的用法

    ### Synchronized关键字在Java中的应用 #### 概述 `synchronized`是Java语言中的一个关键字,主要用于实现线程同步,防止多个线程同时访问共享资源而导致的数据不一致问题。通过`synchronized`关键字,开发者可以...

    [JAVA][synchronized的使用]

    在Java编程语言中,`synchronized`关键字是一个至关重要的概念,它主要用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本篇文章将深入探讨`synchronized`的使用,包括其基本原理、使用方式以及实际应用...

    Java synchronized详细解读.docx

    Java中的`synchronized`关键字是多线程编程中用于同步控制的关键元素,它的主要目标是解决并发环境下多个线程对共享资源的访问冲突。在Java中,由于线程共享内存空间,如果没有适当的同步机制,可能会导致数据不一致...

    生产者消费者Java—synchronized 机制

    在这个项目中,开发者利用`synchronized`关键字来实现线程同步,确保数据在生产与消费过程中的安全。 `synchronized`是Java中用于实现线程互斥的关键字,它提供了对共享资源的独占访问。当一个线程进入由`...

    第15讲 synchronized和ReentrantLock有什么区别呢?1

    在Java编程中,synchronized和ReentrantLock都是用于实现线程同步的重要工具,它们在并发控制方面扮演着关键角色。然而,两者之间存在一些显著的区别,这些差异体现在功能、灵活性、性能以及使用场景上。 首先,...

    正确使用多线程同步锁@synchronized()1

    `@synchronized`关键字是Apple提供的一种简便的同步机制,它可以帮助开发者确保在多线程环境下对共享资源进行原子性操作,防止数据竞争问题。本文将深入探讨`@synchronized`的工作原理、特点以及使用时需要注意的...

Global site tag (gtag.js) - Google Analytics