package function.thread;
class AA{
}
class ThreadDemo extends Thread {
// 共享一个静态数据成员
private static String a = "" ;
ThreadDemo() {
}
ThreadDemo(String szName) {
super(szName);
}
public void run() {
// 为了更清楚地看到不正确的结果,这里放一个大的循环
if (this.getName().equals("Thread1")) {
System.out.println(this.getName()+" enter synchronized before.....\n");
synchronized (a) {
System.out.println(this.getName()+" enter.....");
// 为了演示产生的问题,这里设置一次睡眠
try {
for(int i = 0;i<10;i++){
System.out.println(this.getName()+" print ....");
Thread.sleep(200);
}
} catch (InterruptedException e) {
}
// 输出结果
System.out.println(this.getName()+" go off.....\n");
}
} else if (this.getName().equals("Thread2")) {
try {
for(int j =0;j<10;j++){
System.out.println(this.getName()+" enter synchronized before....."+j);
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (a) {
System.out.println(this.getName()+" enter.....");
// 为了演示产生的问题,这里设置一次睡眠
try {
for(int i = 0;i<10;i++){
System.out.println(this.getName()+" print......");
Thread.sleep(200);
}
} catch (InterruptedException e) {
}
// 输出结果
System.out.println(this.getName()+" go off.....\n");
}
}
}
}
public class ThreadSync {
public static void main(String args[]) {
ThreadDemo th1 = new ThreadDemo("Thread1");
ThreadDemo th2 = new ThreadDemo("Thread2");
th1.start();
th2.start();
}
}
运行结果:
Thread1 enter synchronized before.....
Thread2 enter synchronized before.....0
Thread1 enter.....
Thread1 print ....
Thread1 print ....
Thread2 enter synchronized before.....1
Thread2 enter synchronized before.....2
Thread1 print ....
Thread1 print ....
Thread2 enter synchronized before.....3
Thread1 print ....
Thread2 enter synchronized before.....4
Thread1 print ....
Thread2 enter synchronized before.....5
Thread1 print ....
Thread2 enter synchronized before.....6
Thread1 print ....
Thread2 enter synchronized before.....7
Thread1 print ....
Thread2 enter synchronized before.....8
Thread1 print ....
Thread2 enter synchronized before.....9
Thread1 go off.....
Thread2 enter.....
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 print......
Thread2 go off.....
说明:在进入synchronized 块之前,线程不会被阻塞。
比喻:多个人进入一个房间,房间好比是共享的,房间的钥匙好比是锁
相关推荐
本示例"java多线程的条件对象和锁对象demo"着重探讨了如何利用锁对象和条件对象来精细控制线程的执行流程。 首先,我们需要了解Java中的锁对象。Java提供了多种类型的锁,其中最基础的是`synchronized`关键字,它...
在编程领域,线程互斥是多线程编程中一...理解并正确使用线程互斥对象,能够帮助开发者在多线程环境中编写高效且稳定的代码。在实际编程中,要时刻注意资源的同步和并发控制,以避免可能出现的竞态条件和其他并发问题。
Java对象锁和类锁是Java多线程编程中至关重要的概念,它们是通过`synchronized`关键字来实现的,用于确保代码在并发环境下的线程安全。在这个全面解析中,我们将深入探讨这两个锁机制,理解它们的工作原理以及如何在...
在Java编程语言中,多线程是并发执行多个任务或操作的一种方式,这对于优化系统性能、提高资源利用率具有重要意义。...对于开发者来说,理解和熟练掌握`synchronized`是编写高效、安全的多线程Java程序的基础。
在学习多线程时,我们需要理解以下几个核心概念: 1. **线程的创建**:程序可以通过创建`Thread`对象并调用其`start()`方法来启动一个新线程。在Java中,还可以通过实现`Runnable`接口或继承`Thread`类来创建线程。...
【武汉理工大学】的这个【面向对象与多线程综合实验】是一个典型的软件开发项目,旨在让学生深入理解并实践这两种核心技术在实际系统中的应用。在这个实验中,学生将设计并实现一个【档案管理系统】,该系统服务于三...
在本文中,我们将深入探讨如何使用面向对象编程和多线程技术来设计一个电梯系统,以实现高效且并发的操作。这个项目是基于VC6.0开发环境,它是一款经典的Microsoft Visual C++集成开发环境,虽然现在已经有些过时,...
总的来说,理解和掌握多线程中的互斥锁是非常重要的,它有助于我们在并发环境中保证程序的正确性和稳定性。通过合理的线程同步,我们可以有效地避免数据竞争,从而构建更加健壮的多线程应用程序。
5. 多线程中的数据同步:如何使用锁和同步对象保护共享资源。 6. 错误处理和调试:在多线程环境中定位和修复问题的策略。 要充分利用这个框架,你需要深入理解上述每个方面,并根据自己的项目需求进行适当的调整和...
Java多线程与锁是Java并发编程中的核心概念,它们在构建高效、可扩展的并发应用程序中起着至关重要的作用。下面将详细讲解这两个主题。 首先,Java中的多线程是指程序执行时可以同时进行多个任务。这得益于操作系统...
在易语言中,可以通过创建线程对象来实现这一功能,理解线程的生命周期(创建、执行、等待、结束)是关键。 2. **线程同步与互斥**:在多线程环境下,数据安全和一致性是个挑战。易语言提供了多种同步机制,如锁、...
"鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地...通过分析和实践"鱼刺多线程注册源码",不仅可以提高对多线程编程的理解,还能为以后的项目提供宝贵的实践经验。
在C++编程中,多线程技术是一种强大的工具...理解并熟练运用这些概念和工具,能够帮助开发者编写出高效且安全的多线程应用程序。在实际学习过程中,深入探究这些知识点,结合实践案例,将会对提升C++编程技能大有裨益。
以上只是Java多线程、锁和内存模型的一部分核心概念,深入理解这些知识点对于编写高效、可靠的并发程序至关重要。在面试中,面试官通常会通过这些问题来评估候选人的并发编程能力。因此,对这些概念的深入理解和实践...
- 代码块:指定对象锁,只对代码块进行同步,更细粒度的控制。 2. ReentrantLock(可重入锁): - Lock接口的实现,提供了比synchronized更强大的功能和更细粒度的控制。 - 可重入:持有锁的线程可以再次获取该...
首先,让我们理解什么是多线程。多线程是指一个应用程序内同时运行多个独立的执行线程。在C#中,可以使用`System.Threading`命名空间中的`Thread`类创建和管理线程。通过开启新线程,我们可以让CPU在处理一项任务的...
1. **线程安全**:确保共享数据在多线程环境下正确访问,通常需要使用锁(如Monitor或Mutex)、信号量(Semaphore)或原子操作来实现。 2. **线程间通信**:线程间的同步和通信至关重要,可以使用事件(Event)、...
本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多线程允许一个应用程序同时执行多个任务,每个任务都在一个独立的线程上运行。C#中,我们可以通过System....
基于Java并发编程的多线程同步与锁机制 ... 对象锁与类锁的区别。 可重入锁的特性与应用。 3. 并发工具类 ReentrantLock的使用与特性(公平锁、非公平锁、可重入性)。 ReadWriteLock的读写分离机制。
源代码通常由C++或类似的面向对象编程语言编写,因为它提供了对低级内存管理及多线程操作的良好支持。文档可能详细解释了如何使用模块中的各种功能,示例代码则可以帮助初学者快速上手。编译和部署指南将指导用户...