`

传统线程互斥技术

阅读更多
/**
 * TraditionalSynchronized.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-16    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
 */

package cn.com.songjy.test.socket.thread;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:TraditionalSynchronized 
 * 传统线程互斥技术
 * 
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-16 上午10:22:22
 */

public class TraditionalSynchronized {

	private static Log log = LogFactory.getLog(TraditionalThread.class);

	public static void main(String[] args) {
		new TraditionalSynchronized().init();
	}

	private void init() {

		final OutPuter outPuter = new OutPuter();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					outPuter.output("abcdefghijk");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					outPuter.output1("kjihgfedcba");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					OutPuter.output2("123456789");
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					outPuter.output3("987654321");
				}
			}
		}).start();
	}

	static class OutPuter {
		String str = "aa";

		public void output(String name) {// 一个一个打印字符串中的字符到控制台,重新组成完整的字符串,若不完整,说明没有同步,线程不安全
			int len = name.length();
			synchronized (/* str */this) {
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}
		}

		/*
		 * 下面的方法与上面的方法output同步 下面注释部分代码不去掉的话容易出现死锁
		 */
		public synchronized void output1(String name) {// 一个一个打印字符串中的字符到控制台,重新组成完整的字符串,若不完整,说明没有同步,线程不安全
			int len = name.length();
			// synchronized (/*str*/this) {
			for (int i = 0; i < len; i++) {
				System.out.print(name.charAt(i));
			}
			System.out.println();
			// }
		}

		/*
		 * 要在内部类中声明静态方法或成员变量,必须用static修饰内部类 下面的方法与上面的方法output和output1不同步
		 */
		public static synchronized void output2(String name) {// 一个一个打印字符串中的字符到控制台,重新组成完整的字符串,若不完整,说明没有同步,线程不安全
			int len = name.length();
			for (int i = 0; i < len; i++) {
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}

		/*
		 * 下面的方法与上面的方法output2同步,但与output、output1不同步
		 * 同步原因是因为不管是静态方法还是非静态方法,都要有一个对象与其关联,而类的字节码
		 * 在内存中也是一个对象,静态方法在运行的时候虽不需要创建类的实例对象,但字节码已在内存中了
		 */
		public void output3(String name) {// 一个一个打印字符串中的字符到控制台,重新组成完整的字符串,若不完整,说明没有同步,线程不安全
			int len = name.length();
			synchronized (/* str */OutPuter.class) {
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}
		}
	}
}

/*
 * 备注:
 * 
 * 一、静态方法不能访问内部类的实例对象,即无法在静态方法创建内部类的实例
 * 
 * 二、内部类可以访问外部类的成员变量,这就意味着外部类必须实例化才能为自己的成员变量分配空间
 * 
 * 三、要想创建内部类的实例对象,必须要有外部类的实例对象,所以可以在外部类中创建非静态成员方法,在此方法中就可以创建内部类的实例,但要想访问内部类的成员变量,
 * 必须用final修饰创建的内部类
 */

引自:http://down.51cto.com/data/443410
分享到:
评论

相关推荐

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    多线程的小例子,线程互斥的问题

    本文将深入探讨标题和描述中提到的“多线程的小例子”以及线程互斥的概念。 线程互斥是多线程编程中的一个关键概念,用于确保在特定时间内,只有一个线程可以访问共享资源,以防止数据不一致性和竞态条件。在C#中,...

    传智播客_张孝祥_传统线程同步通信技术

    张孝祥老师的课程"传智播客_张孝祥_传统线程同步通信技术"深入浅出地讲解了这一主题,旨在帮助开发者理解和掌握线程间的协作与数据共享方式。 线程同步是指在多线程环境下,控制多个线程按一定的顺序执行,以避免...

    多线程的讲解

    ### 三、传统线程互斥技术 #### 3.1 互斥问题 在多线程环境中,多个线程可能同时访问共享资源(如银行账户余额),如果没有适当的控制措施,可能导致数据一致性问题或竞态条件。这种情况下,需要采取措施确保同一...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)(0515).rar

    这个压缩包“C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)(0515).rar”包含了六个关于C#中多线程应用的实例,涵盖了从基础到高级的多线程使用场景,如线程创建、线程同步和互斥。...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)_0520.rar

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和优化...学习并理解这些实例,将有助于开发者更好地在C#.NET项目中运用多线程技术,提高程序的性能和效率。

    传统线程同步通信技术二

    了解并熟练掌握这些传统线程同步通信技术,能帮助你在多线程编程中有效地避免数据竞争,提高程序的并发性和可靠性。在实际开发中,应根据具体需求选择最合适的同步机制,同时考虑线程同步带来的开销,以实现最佳性能...

    传统线程同步通信技术一

    本文将深入探讨传统线程同步通信技术,主要包括临界区、信号量、互斥量以及事件对象。 1. **临界区**(Critical Section) 临界区是程序中用于访问共享资源的代码段。为了防止多个线程同时进入临界区,我们可以...

    java加强笔记

    传统线程互斥技术 - 线程间的互斥通常通过`synchronized`关键字或显式锁(`Lock`)来实现。 ##### 4. 传统线程同步通信技术 - 线程之间的同步通信可以通过`wait()`、`notify()`和`notifyAll()`等方法来实现。 #####...

    C++ 多线程综合技术篇

    在C++编程中,多线程技术是一种关键的并发处理机制,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本综合技术篇将深入探讨C++中的多线程概念、实现方法以及常见问题。 一、线程基础 线程是操作...

    linux线程技术

    【Linux线程技术】在操作系统领域,Linux线程是指在Linux环境下实现的多线程编程技术。虽然在早期的Linux内核中并没有直接支持线程的概念,而是通过轻量级进程(Lightweight Process, LWP)来模拟线程的行为。在...

    Visual_C++利用互斥量同步线程实现文件读取进度条

    为了更高效地管理文件读取与进度更新过程,本篇文章将介绍如何利用线程同步技术中的互斥量(mutex)来实现这一功能。 #### 二、线程与进程基础知识 - **进程**:一个正在执行的应用程序及其资源集合,包括私有的虚拟...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    除了传统的多线程,Delphi还支持异步编程模型,如使用IO Completion Ports(IOCP)来处理I/O密集型任务,提高系统吞吐量。IOCP允许系统在I/O操作完成时自动通知线程,避免了不必要的等待和上下文切换。 七、实际...

    java多线程编程技术

    Java多线程编程技术是Java编程语言中一个非常重要的技术分支,它允许程序员在程序中创建多个执行流(线程),这些线程可以并发执行,从而使得程序能更加高效地利用系统资源,同时提高应用的响应速度和吞吐能力。...

    Linux下多线程技术分析及应用.pdf

    Linux下的多线程不同于传统的进程创建,它通过克隆(`clone`)系统调用来创建线程,这种方法显著降低了CPU开销和内存消耗。克隆出的线程与父进程共享资源,例如文件、信号处理程序和虚拟内存,同时利用“写时复制”...

    检测线程死锁,告诉你如何检测线程死锁

    针对线程死锁的检测,传统方法是通过构建资源分配图,并寻找图中的环路来判断是否存在死锁。然而这种方法不仅实现复杂,而且对系统性能的影响较大。本文介绍一种更为简单高效的方法,即通过监视互斥锁的使用情况来...

    用VC多线程技术实现PC机全双工串行通讯

    通过利用VC++中的多线程技术,我们可以有效地实现PC机的全双工串行通讯,不仅解决了传统串口通讯中的阻塞问题,还极大地提高了通讯的效率和程序的简洁性。此外,在滑动窗口协议的支持下,全双工通讯还能够实现数据的...

    基于消息的异步套接字和多线程技术网络通信编程

    传统的同步套接字会在执行I/O操作时阻塞当前线程,直到操作完成,这可能会严重影响程序的响应速度。相比之下,异步套接字则能在数据到达时通过特定机制通知程序,从而使程序无需等待即可继续执行其他任务。 - **...

    Linux系统的线程技术.pdf

    用户级线程完全由用户空间的程序实现和管理,包括线程调度、同步和互斥,这提供了更高的灵活性,适用于特定的应用场景,如实时处理、数据下载和采集。另一方面,内核级线程则由操作系统内核管理,通过系统调用来实现...

Global site tag (gtag.js) - Google Analytics