`

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

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

public class MainService {

	private static MainService instance = new MainService();

	public static MainService getInstance() {
		return instance;
	}
	
	@SuppressWarnings("static-access")
	public void fun(String parm) {
		synchronized (parm) {
			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();
				}
			}
		}
	}
}

 

package test2;

public class TestThread {

	public static final String str01 = "1";
	public static final String str02 = "2";

	public static void test01() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				MainService.getInstance().fun(str01);
			}
		}).start();

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

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

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

	public static void test03() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				new MainService().fun(str01);
			}
		}).start();

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

	public static void test04() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				new MainService().fun(str01);
			}
		}).start();

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

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

		// test02();
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-0 当前i值:1
		// 当前对象:test.MainService@41d5550d 当前线程:Thread-0 当前i值:2
		// 当前对象:test.MainService@41d5550d 当前线程: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

		// test03();
		// 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:1
		// 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:1
		// 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:2
		// 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:2
		// 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:3
		// 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:3
		
		// test04();
		// 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:1
		// 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:2
		// 当前对象:test2.MainService@24c21495 当前线程:Thread-0 当前i值:3
		// 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:1
		// 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:2
		// 当前对象:test2.MainService@41d5550d 当前线程:Thread-1 当前i值:3
	}
}

 

 

同一对象,参数不同,方法不互斥

同一对象,参数相同,方法互斥

不同对象,参数不同,方法不互斥

不同对象,参数相同,方法互斥

分享到:
评论

相关推荐

    深入理解Python 多线程

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

    C#语言多线程初步理解

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

    Revit二次开发 c# 多线程处理

    为了解决这个问题,开发者通常会借助C#语言的多线程技术来提升效率。本文将深入探讨如何在Revit中实现C#的多线程处理,并通过实例和源代码来阐述这一过程。 首先,我们需要理解Revit的API限制。Revit不允许在非主线...

    易语言多线程传递多参数

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

    多线程thread线程的理解

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

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

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

    pb9多线程控件,能够真实实现多线程

    "有例子"意味着提供了示例代码,帮助用户理解如何使用这个多线程控件。"虽不太完善"暗示这个控件可能存在一些未解决的问题或者未完善的特性,但仍然可以有效地实现多线程操作。"而不是PB本身所实现的共享机制"指的是...

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

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

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

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

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

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

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

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

    Visual Basic 6.0建立多线程程序就是这么简单

    本文将详细介绍如何在VB6中实现多线程,并提供两种实用的方法来帮助开发者更好地理解和掌握多线程编程。 #### 二、多线程简介 多线程是指在单个进程中创建并运行多个独立执行单元的技术。每个线程可以并发执行不同...

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

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

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

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

    轻松理解多线程

    总之,理解并熟练掌握多线程编程是每个 C# 开发者必备的技能,无论是优化程序性能,还是应对并发挑战,多线程都扮演着至关重要的角色。通过实际案例和代码示例,我们可以更好地理解这些抽象的概念,并将它们应用到...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程...通过分析和运行这些实例,开发者可以深入理解多线程在实际项目中的运用,提升解决问题的能力。

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

    易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛,使得更多非专业背景的用户也能快速上手编程。...通过研究这些内容,可以深入理解易语言的线程机制,并掌握如何在实践中应用多线程技术。

    java多线程编程(第二版)

    《Java多线程编程(第二版)》这本书深入探讨了这一主题,旨在帮助开发者更好地理解和应用Java的并发特性。 在Java中,多线程允许程序同时执行多个任务,提高应用程序的效率和响应性。核心概念包括线程的创建、同步...

    PB多线程实现

    二、PB12.5的多线程支持 PB12.5引入了对多线程的更好支持,它引入了一个名为“Worker Thread”的新概念。开发者可以创建一个工作线程对象,然后在这个对象上执行自定义的代码块。这使得在PB应用中实现多线程变得更加...

    C#多线程编程实战 源代码

    因此,现代应用程序开发人员必须深入理解多线程。 本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过...

Global site tag (gtag.js) - Google Analytics