`
qq4628241
  • 浏览: 62928 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于Java中synchronized关键字的案例

 
阅读更多
synchronize同步问题对于锁得理解
package test.synchronize;

public class AmSynchornizeClass {
	private int index=0;
	
	private static int staticIndex = 0;
	
	//成员锁对象
	private Object lock = new Object();
	
	
	/**
	 * 锁对象是this
	 * @return
	 */
	public synchronized int getIndex() {
		return index;	
	}
	
	/**
	 * 锁对象this 等同于  public synchronized int getIndex(){...}
	 */
	public int getIndex2() {
		synchronized (this) {
			return index;	
		}
	}
	
	/**
	 * 锁对象时成员变量lock
	 * @return
	 */
	public int getIndex3() {
		synchronized (lock) {
			return index;	
		}
	}
	
	/**
	 * 错误案例:锁对象new Object()离开了方法getIndex4()块没有实际意义
	 * @return
	 */
	public int getIndex4(){
		synchronized(new Object()){
			return index;	
		}
	}
	
	public synchronized void increaseIndex() {
		try {
			Thread.sleep(5*1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		index++;
	}
	
	public void increaseIndex2() {
		synchronized(this){
			try {
				Thread.sleep(5*1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		    index++;
		}
	}
	
	public void increaseIndex3() {
		synchronized(lock){
			try {
				Thread.sleep(5*1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			 index++;
		}
	}
	
	/**
	 * 锁对象是AmSynchornizeClass.class等同于public  static void substract2()
	 */
	public synchronized static void substract(){
		staticIndex--;
	}
	
	public static void substract2(){
		synchronized(AmSynchornizeClass.class){
			staticIndex--;
		}
	}
}


package test.synchronize;

import org.junit.Test;

public class TestSynchronize {
	@Test
	public void testSynchronizedLock1() {
		final AmSynchornizeClass asc1 = new AmSynchornizeClass();
		final AmSynchornizeClass asc2 = new AmSynchornizeClass();
		Runnable getThread = new Runnable(){
			@Override
			public void run() {
				System.out.println("go into get method()...");
				System.out.println(asc1.getIndex());
				System.out.println("get out from get method()...");
			}
		};
		
		Runnable increaseThread = new Runnable(){
			@Override
			public void run() {
				System.out.println("go into increase method()...");
				asc2.increaseIndex();
				System.out.println("go out increase method()...");
			}
		};
		
		Thread t1= new Thread(increaseThread);
		Thread t2= new Thread(getThread);
		
		t1.start();
		t2.start();
		try {
			while(true){
				if(t1.isAlive() || t2.isAlive()){
						Thread.sleep(200);
				} else {
					break;
				}
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void testSynchronizeLock() {
		final AmSynchornizeClass asc = new AmSynchornizeClass();
		Runnable getThread = new Runnable(){
			@Override
			public void run() {
				System.out.println("go into get method()...");
				System.out.println(asc.getIndex());
				System.out.println("get out from get method()...");
			}
		};
		
		Runnable increaseThread = new Runnable(){
			@Override
			public void run() {
				System.out.println("go into increase method()...");
				asc.increaseIndex();
				System.out.println("go out increase method()...");
			}
		};
		
		Thread t1= new Thread(increaseThread);
		Thread t2= new Thread(getThread);
		
		t1.start();
		t2.start();
		try {
			while(true){
				if(t1.isAlive() || t2.isAlive()){
						Thread.sleep(200);
				} else {
					break;
				}
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

分享到:
评论

相关推荐

    synchronized关键字的用法详解

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

    Java synchronized使用案例

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

    Android synchronized 测试案例

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

    Java中synchronized正确使用方法解析

    Java 中 synchronized 关键字是解决线程安全问题的重要手段,它可以确保在多线程环境下,共享资源的访问安全性。本文将详细介绍 Java 中 synchronized 的正确使用方法,通过示例代码和实践案例,帮助读者深入理解 ...

    java多线程经典案例

    Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突...

    java语言十大经典案例

    `synchronized`关键字用于控制并发访问资源,避免数据不一致。`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信。另外,Java 5引入的`ExecutorService`和`Future`接口提供了更高级的线程池管理机制。 3...

    Java——volatile关键字详解

    Java中的`volatile`关键字是一个非常重要的并发控制工具,它提供了比`synchronized`关键字更为轻量级的同步机制。`volatile`关键字的主要作用是确保多线程环境下的可见性和禁止指令重排序,但不保证原子性。 **...

    java案例分析 java 案例 好资源

    6. **多线程**:Java提供内置的线程支持,案例会介绍如何创建和管理线程,使用synchronized关键字进行同步,以及线程池的使用,这对于构建高并发应用至关重要。 7. **网络编程**:Java的Socket编程允许创建客户端和...

    关于java的一些经典案例

    在"关于java的一些经典案例"这个主题中,我们可以深入探讨Java在不同领域的应用,通过具体的代码实例来学习和理解其核心概念。这些案例涵盖了基础语法、数据结构、异常处理、多线程、网络编程等多个方面。 1. **...

    java语言程序设计案例教程

    多线程是Java的一大亮点,教程将介绍如何创建和管理线程,包括线程同步机制(如synchronized关键字、wait()和notify()方法)以及线程池的使用。案例可能涉及模拟多个任务并行执行或实现简单的并发应用程序。 网络...

    java经典课程设计案例

    2. **继承与多态**:在设计案例中,可能会有动物、狗、猫这样的类层次结构,展示如何通过继承实现代码重用,并通过多态实现不同类型的对象共享相同的接口,增强程序的灵活性。 3. **异常处理**:Java的异常处理机制...

    164个java经典代码案例

    案例将展示如何创建和管理线程,处理线程同步和通信,如synchronized关键字、wait()、notify()和notifyAll()方法的应用。 反射是Java的另一个强大特性,允许在运行时检查和修改类、接口和对象。通过案例,你可以...

    java编程技巧典型案例解析

    - 同步机制:synchronized关键字,Lock接口,以及死锁、活锁的概念。 - 线程池:ThreadPoolExecutor的配置与使用,以及线程池的优化策略。 6. IO与NIO - 流的概念:输入流、输出流的分类,以及各自的使用场景。 ...

    java基础的详细案例笔记

    10. **多线程**:Java提供了丰富的API支持并发编程,如Thread、Runnable接口,以及synchronized关键字,笔记可能涉及到线程的创建、同步和通信。 11. **枚举与注解**:枚举是Java中的特殊数据类型,而注解则是一种...

    Java经典案例,包含了很多经典案例,希望可以帮到大家

    例如,一个关于多线程的案例可能会演示如何创建和管理线程,以及如何使用synchronized关键字保证数据的安全性。IO流的案例可能涵盖文件读写、数据的序列化和反序列化等。网络编程的案例可能包括TCP/IP通信和HTTP请求...

    Java基础案例教程(第2版)-课后习题答案.zip

    8. **多线程**:Java支持多线程编程,习题可能包括创建线程、同步机制(synchronized关键字和wait/notify方法)以及线程池的使用。 9. **文件和目录操作**:Java的File类和nio包提供了丰富的API用于操作文件和目录...

    李兴华 java核心技术 配套案例代码源码

    6. **多线程**:Java支持并发编程,源码中可能包含Thread类的使用,以及同步控制(synchronized关键字、Lock接口等)的应用,帮助理解多线程间的协作和竞争。 7. **反射机制**:Java的反射机制允许在运行时动态地...

    java 经典课程设计案例

    6. **多线程**:Java支持多线程编程,案例可能包含Thread类和Runnable接口的使用,线程同步(synchronized关键字,wait()、notify()方法)等。 7. **图形用户界面(GUI)编程**:可能通过Swing或JavaFX库来创建窗口...

    java 之十大经典案例

    以下是一些Java中的十大经典案例,它们涵盖了不同领域的应用,帮助我们更好地掌握这门语言。 1. **单例模式**: 单例模式是一种限制类实例化次数的设计模式,确保一个类只有一个实例,并提供一个全局访问点。在...

    java十大经典案例源码

    6. ** 多线程 **:Java支持多线程编程,案例可能包括创建Thread类的子类、实现Runnable接口,以及线程同步(如synchronized关键字、wait/notify机制)。 7. ** GUI编程 **:Java Swing或JavaFX库可以用来创建图形...

Global site tag (gtag.js) - Google Analytics