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 } }
结果:
同一类的所有对象执行同一方法,均互斥。
相关推荐
在IT领域,多线程是程序设计中的一个重要概念,尤其在现代计算机系统中,它能够充分利用多核处理器的计算能力,提高程序的执行效率。本文将深入探讨多线程的相关知识点,包括其定义、作用、优缺点以及如何在实际编程...
总结起来,无论是C语言还是Java,实现多线程都需要理解线程的创建、调度、同步和通信。通过合理利用线程,开发者可以编写出更高效、响应更快的应用程序,充分利用现代计算机的多核优势。在实际开发中,应根据需求...
Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程。 那么什么时候用多...
首先,我们需要理解多线程中的一些核心概念: 1. **线程**:线程是操作系统分配CPU时间的基本单位,每个线程都有自己的执行路径,它们可以并行或交替执行。 2. **共享资源**:在多线程环境中,多个线程可能需要...
本教程将帮助初学者理解C#中的多线程概念,并通过一个Windows Forms应用程序实例,演示如何在WinForm控件中启动、暂停、继续子线程以及输出数据。 首先,我们来看多线程的基本概念。在单线程程序中,所有的任务按...
通过学习和实践上述知识点,你将能够深入理解多线程编程,并能有效利用这一技术提高程序的性能和响应性。如果你下载了"多线程.rar"这个压缩包,其中很可能包含了示例代码和教程,这将是你学习多线程的宝贵资源。
在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。...对于易语言的学习者来说,研究这个源码将是一个宝贵的实践机会,可以加深对多线程编程的理解。
首先,理解多线程并发访问同一变量的问题。在多线程环境中,如果多个线程同时读写同一变量,可能会引发数据不一致性和竞态条件。为了防止这种情况,我们需要一种机制来同步线程,确保同一时间只有一个线程可以访问该...
理解多线程的基本原理和实践方法,有助于开发者在各种场景下实现更高效的自动化解决方案。 在压缩包文件“多线程.Q”中,很可能包含了一个或多个人工编写的具体多线程按键精灵脚本示例,可能包括线程的创建、线程间...
通过理解多线程的基本概念,掌握易语言中的线程创建和管理方法,以及注意线程安全和同步,你可以编写出高效且稳定的多线程程序。在实际开发中,不断实践和优化,将是提升多线程编程能力的关键。
标题中的“pb9多线程控件”指的是在PowerBuilder 9.0(PB9)环境中,使用的一种能够实现真正多线程功能的组件或技术。PowerBuilder是一款经典的面向对象的开发工具,主要用于构建数据库应用系统。在PB的早期版本中,...
【多线程】是计算机程序设计中的一个重要概念,特别是在 C# 这样的多任务编程语言中。多线程允许一个程序同时执行多个不同的任务,从而提高应用程序的性能和响应速度。在 C# 中,可以使用 `System.Threading` 命名...
《深入理解易语言版多线程通用框架》 在计算机编程中,多线程是一种并发执行任务的技术,它允许多个任务在同一时间内运行,从而提高了系统资源的利用率和程序的响应速度。尤其在易语言这样的高级编程环境中,多线程...
首先,我们需要理解多线程的基本概念。在计算机科学中,线程是程序执行的最小单元,每个线程都有自己的程序计数器、系统栈、局部变量和状态。多线程允许一个应用程序同时执行多个不同的任务,这在处理大量数据、实现...
Linux 下 C 语言多线程编程实例 Linux 下的多线程编程是一种非常重要的技术,在...本实例提供了一个非常实用的多线程编程示例,帮助我们更好地理解多线程编程的基本概念和技术,并且可以作为实际应用的参考和借鉴。
以下是对Java多线程的深入理解: 线程概述 基本概念:线程是操作系统能够进行运算调度的最小单位,一个进程可以包含多个线程。 特性:线程不拥有系统资源,只拥有一点必不可少的、能保证独立运行的资源。同一进程...
在本压缩包“易语言源码多线程类源码.rar”中,包含了易语言编写的一个多线程类的源代码示例。多线程技术是现代软件开发中不可或缺的一部分,它允许程序同时执行多个任务,提高系统资源利用率,提升程序运行效率。 ...
总之,这个.NET 2.0的多线程实例涵盖了多线程的创建与管理、线程同步、UI更新、文件系统操作、异步编程等多个核心知识点,对于理解和实践.NET环境下的并发编程具有很高的价值。通过学习和实践这些示例,开发者可以...
通过学习和实践这个项目,你可以深入理解多线程的基本原理,以及如何将它们应用到实际的聊天室程序中。同时,也可以在此基础上进一步扩展功能,例如实现更复杂的用户认证、消息加密、文件传输等特性,提升你的编程...
本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多线程允许一个应用程序同时执行多个任务,每个任务都在一个独立的线程上运行。C#中,我们可以通过System....