`

我是这么理解多线程的 (一)

    博客分类:
  • JAVA
 
阅读更多
package test2;

public class MainService {

	private static MainService instance = new MainService();

	public static MainService getInstance() {
		return instance;
	}
	
	/**
	 * 同步块 synchronized (this)
	 * @param parm
	 */
	@SuppressWarnings("static-access")
	public void fun03(String parm) {
		synchronized (this) {
			for (int i = 1; i < 4; i++) {
				StringBuffer buf = new StringBuffer();
				buf.append("当前对象:").append(this).append("\t\t");
				buf.append("当前线程:").append(Thread.currentThread().getName())
				.append("\t\t");
				buf.append("当前i值:").append(i);
				System.out.println(buf.toString());
				try {
					Thread.currentThread().sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 同步块 synchronized (this.getClass())
	 * @param parm
	 */
	@SuppressWarnings("static-access")
	public void fun04(String parm) {
		synchronized (this.getClass()) {
			for (int i = 1; i < 4; i++) {
				StringBuffer buf = new StringBuffer();
				buf.append("当前对象:").append(this).append("\t\t");
				buf.append("当前线程:").append(Thread.currentThread().getName())
				.append("\t\t");
				buf.append("当前i值:").append(i);
				System.out.println(buf.toString());
				try {
					Thread.currentThread().sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

一个使用同步块     synchronized (this)

另一个使用同步块 synchronized (this.getClass())

 

 

测试类,TestThread03

package test2;

public class TestThread03 {

	public static void test01() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				new MainService().fun03(null);
			}
		}).start();

		new Thread(new Runnable() {
			@Override
			public void run() {
				new MainService().fun03(null);
			}
		}).start();
	}

	public static void test02() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				MainService.getInstance().fun03(null);
			}
		}).start();

		new Thread(new Runnable() {
			@Override
			public void run() {
				MainService.getInstance().fun03(null);
			}
		}).start();
	}

	public static void main(String[] args) {
		// test01();
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:1
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:1
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:2
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:2
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:3
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:3

		// test02();
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:1
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:2
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:3
		// 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:1
		// 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:2
		// 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:3
	}
}

结果:

不同对象执行同一方法,方法不互斥。

同一对象执行同一方法,方法互斥。

package test2;

public class TestThread04 {

	public static void test01() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				new MainService().fun04(null);
			}
		}).start();

		new Thread(new Runnable() {
			@Override
			public void run() {
				new MainService().fun04(null);
			}
		}).start();
	}

	public static void test02() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				MainService.getInstance().fun04(null);
			}
		}).start();

		new Thread(new Runnable() {
			@Override
			public void run() {
				MainService.getInstance().fun04(null);
			}
		}).start();
	}

	public static void main(String[] args) {
		// test01();
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:1
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:2
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:3
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:1
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:2
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-1 当前i值:3

		// test02();
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:1
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:2
		// 当前对象:test.MainService@24c21495 当前线程:Thread-0 当前i值:3
		// 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:1
		// 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:2
		// 当前对象:test.MainService@24c21495 当前线程:Thread-1 当前i值:3
	}
}

 结果:

同一类的所有对象执行同一方法,均互斥。

分享到:
评论

相关推荐

    理解多线程,写一个多线程应用程序,要求能在用户级实现线程的调度,如启动、挂起、恢复、停止,的C thread、java thread实现。

    总结起来,无论是C语言还是Java,实现多线程都需要理解线程的创建、调度、同步和通信。通过合理利用线程,开发者可以编写出更高效、响应更快的应用程序,充分利用现代计算机的多核优势。在实际开发中,应根据需求...

    深入理解Python 多线程

    Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程。 那么什么时候用多...

    C#多线程互斥实例 多线程获取同一变量

    首先,我们需要理解多线程中的一些核心概念: 1. **线程**:线程是操作系统分配CPU时间的基本单位,每个线程都有自己的执行路径,它们可以并行或交替执行。 2. **共享资源**:在多线程环境中,多个线程可能需要...

    IOS多线程理解

    iOS多线程是移动应用开发中不可或缺的...开发者可以根据项目需求选择合适的多线程方案,从简单的NSThread到强大的GCD,每一种都有其适用的场景和优势。正确理解和运用这些技术,将有助于构建高效、响应迅速的iOS应用。

    C#语言多线程初步理解

    本教程将帮助初学者理解C#中的多线程概念,并通过一个Windows Forms应用程序实例,演示如何在WinForm控件中启动、暂停、继续子线程以及输出数据。 首先,我们来看多线程的基本概念。在单线程程序中,所有的任务按...

    多线程thread线程的理解

    通过学习和实践上述知识点,你将能够深入理解多线程编程,并能有效利用这一技术提高程序的性能和响应性。如果你下载了"多线程.rar"这个压缩包,其中很可能包含了示例代码和教程,这将是你学习多线程的宝贵资源。

    易语言多线程传递多参数

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。...对于易语言的学习者来说,研究这个源码将是一个宝贵的实践机会,可以加深对多线程编程的理解。

    多线程_按键精灵经典多线程操作_

    理解多线程的基本原理和实践方法,有助于开发者在各种场景下实现更高效的自动化解决方案。 在压缩包文件“多线程.Q”中,很可能包含了一个或多个人工编写的具体多线程按键精灵脚本示例,可能包括线程的创建、线程间...

    易语言多线程多次启动一个子程序

    通过理解多线程的基本概念,掌握易语言中的线程创建和管理方法,以及注意线程安全和同步,你可以编写出高效且稳定的多线程程序。在实际开发中,不断实践和优化,将是提升多线程编程能力的关键。

    Qt 多线程访问同一个变量

    首先,理解多线程并发访问同一变量的问题。在多线程环境中,如果多个线程同时读写同一变量,可能会引发数据不一致性和竞态条件。为了防止这种情况,我们需要一种机制来同步线程,确保同一时间只有一个线程可以访问该...

    轻松理解多线程

    【多线程】是计算机程序设计中的一个重要概念,特别是在 C# 这样的多任务编程语言中。多线程允许一个程序同时执行多个不同的任务,从而提高应用程序的性能和响应速度。在 C# 中,可以使用 `System.Threading` 命名...

    多线程框架通用多线程源码.zip

    《深入理解易语言版多线程通用框架》 在计算机编程中,多线程是一种并发执行任务的技术,它允许多个任务在同一时间内运行,从而提高了系统资源的利用率和程序的响应速度。尤其在易语言这样的高级编程环境中,多线程...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    首先,我们需要理解多线程的基本概念。在计算机科学中,线程是程序执行的最小单元,每个线程都有自己的程序计数器、系统栈、局部变量和状态。多线程允许一个应用程序同时执行多个不同的任务,这在处理大量数据、实现...

    Linux下C语言多线程编程实例

    Linux 下 C 语言多线程编程实例 Linux 下的多线程编程是一种非常重要的技术,在...本实例提供了一个非常实用的多线程编程示例,帮助我们更好地理解多线程编程的基本概念和技术,并且可以作为实际应用的参考和借鉴。

    易语言源码多线程类源码.rar

    在本压缩包“易语言源码多线程类源码.rar”中,包含了易语言编写的一个多线程类的源代码示例。多线程技术是现代软件开发中不可或缺的一部分,它允许程序同时执行多个任务,提高系统资源利用率,提升程序运行效率。 ...

    .NET多线程实例

    总之,这个.NET 2.0的多线程实例涵盖了多线程的创建与管理、线程同步、UI更新、文件系统操作、异步编程等多个核心知识点,对于理解和实践.NET环境下的并发编程具有很高的价值。通过学习和实践这些示例,开发者可以...

    多线程基础与基于多线程的简单聊天室

    通过学习和实践这个项目,你可以深入理解多线程的基本原理,以及如何将它们应用到实际的聊天室程序中。同时,也可以在此基础上进一步扩展功能,例如实现更复杂的用户认证、消息加密、文件传输等特性,提升你的编程...

    单线程与多线程的区别

    理解这两种模型是编程尤其是服务器端开发的基础,尤其是在Java、C#等支持多线程的编程语言中。 首先,让我们来详细探讨一下**单线程**的概念。在单线程环境中,程序的执行是由一个单一的执行线程控制的,这意味着...

    C# 多线程实例多线程实例多线程实例

    本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多线程允许一个应用程序同时执行多个任务,每个任务都在一个独立的线程上运行。C#中,我们可以通过System....

    12.1 Qt5多线程:多线程及简单实例

    在编程领域,尤其是在开发高效、响应迅速的应用程序时,多线程技术扮演着至关重要的角色。Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的...正确理解和使用多线程能够提升应用程序的性能和用户体验。

Global site tag (gtag.js) - Google Analytics