"Java多线程——线程八锁案例分析: 方法锁的对象及执行顺序推测与验证"

版权申诉
0 下载量 154 浏览量 更新于2024-04-19 收藏 28KB DOCX 举报
多线程编程是一种并发编程的方式,可以允许程序同时执行多个任务,提高程序的运行效率。然而,在多线程编程中,由于多个线程之间共享资源,可能会出现竞争条件和线程安全性问题。为了解决这些问题,Java提供了一些同步机制,其中最常用的就是synchronized关键字。 synchronized关键字可以修饰方法或代码块,确保在同一时间只有一个线程可以访问被锁住的代码块或方法。在Java多线程编程中,synchronized修饰的方法锁对象通常是方法的调用者。因此,如果两个方法的调用者是同一个对象,那么这两个方法将使用同一个锁,且先调用方法的线程将先获取锁执行。 在Java中,有一个经典的多线程案例——线程八锁案例。这个案例通过分析代码逻辑和执行顺序,可以推测最终的打印结果。其中,有一个案例是两个线程调用同一个对象的两个同步方法,代码如下: ```java public class Demo { public static void main(String[] args) { Number number = new Number(); new Thread(new Runnable() { @Override public void run() { number.getOne(); } }).start(); new Thread(new Runnable() { @Override public void run() { number.getTwo(); } }).start(); } } ``` 在上述代码中,Number类中有两个同步方法getOne和getTwo,两个线程分别调用这两个方法。根据synchronized关键字的描述,这两个方法使用的锁对象应该是调用方法的对象,也就是Number对象。因此,两个方法都会使用同一个锁对象,在线程执行时会依次获取锁执行。 通过运行代码进行验证,我们可以得到实际的执行结果。根据synchronized锁的规则,先调用getOne方法的线程将获得锁并执行getOne方法,然后调用getTwo方法的线程将等待getOne方法执行完毕释放锁后才能执行getTwo方法。因此,最终打印结果是getOne方法先执行,getTwo方法后执行。 在多线程编程中,理解并掌握锁的概念和原理是至关重要的。通过分析典型的多线程案例,可以更深入地了解Java多线程编程中的同步机制和线程间的协作关系,进而编写出线程安全性更高的程序。对于开发人员来说,熟练掌握多线程编程技巧,将有助于提高程序的性能和质量,实现并发编程中的各种需求。
2023-05-29 上传
第8章 多线程编程 第1页 本章概述 本章的学习目标 主要内容 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第1页。 本章概述 前面我们所开发的程序大多是单线程的,即一个程序只有一条从头到尾的执行路线。然而,现实世界中的很多事务都是有多种途径同时运作的,例如:服务器可能需要同时处理多个客户机的请求,这就需要有多个线程同时在工作。多线程编程使得系统资源并不是由某个执行体独占,而是由多个执行单元共同拥有,轮换使用。正确使用多线程可以消除系统的瓶颈问题,提高整个应用系统的性能。本章将详细介绍Java语言的多线程技术。通过本章的学习,读者应该理解线程和进程的区别,掌握Java的多线程编程技术,了解线程的同步和线程间通信等内容。 第2页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第2页。 本章的学习目标 了解进程和线程的基本概念和区别 掌握创建线程的两种方法 掌握线程同步的概念和方法 了解线程的优先级 掌握线程间通信的方法 第3页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第3页。 第4页 主要内容 8.1 Java线程模型 8.2 创建线程 8.3 同步与线程间通信 8.4 获取线程状态 8.5 本章小结 8.6 思考和练习 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第4页。 8.1 Java线程模型 Java对多线程编程(multithreaded programming)提供了内置支持。多线程程序包含同时运行的两个或多个部分。这种程序的每一部分被称为一个线程,并且每个线程定义了单独的执行路径。因此,多线程是特殊形式的多任务处理。 第5页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第5页。 进程 进程本质上是正在执行的程序。在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配。每个进程都有自己的内存单元,进程之间是互相独立的,一个进程一般不允许访问其他进程的内存空间,因此,进程间通信非常困难。 基于进程的多任务处理就是允许计算机同时运行两个或更多个程序的特性。例如,基于进程的多任务处理可以在运行Java编译器的同时使用文本编辑器或浏览网站。在基于进程的多任务处理中,程序是调度程序能够调度的最小代码单元。 第6页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第6页。 线程 线程是比进程更小的执行单位。如果将进程概念一分为二,则进程中的系统资源,可以看成是一个静态的对象;而程序代码的执行位置,可以看成一个动态对象,这个动态的部分就是线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,线程之间的通信比较容易解决,从而极大地提高了程序的运行效率。 在基于线程的多任务环境中,最小的可调度代码单元是线程,这意味着单个程序可以同时执行两个或更多个任务。例如,文本编辑器可以在打印的同时格式化文本,只要这两个动作是通过两个独立的线程执行即可。 第7页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第7页。 进程和线程的区别 进程和线程的区别可以总结为如下几点: 一个程序至少有一个进程,一个进程至少有一个线程,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 线程在执行过程中与进程也是有区别的,每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口;但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程的执行控制。 一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。 第8页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第8页。 Java中的线程 Java运行时系统在许多方面依赖于线程,并且所有类库在设计时都考虑了多线程。事实上,Java通过利用线程使得整个环境能够异步执行。 在过去几年,多核系统已经变得很普遍了。当然,单核系统仍然在广泛使用。Java的多线程系统在这两种类型的系统中都可以工作。在单核系统中,并发执行的线程共享CPU,每个线程得到一片CPU时钟周期。所以,在单核系统中,两个或更多个线程不是真正同时运行的,但是空闲时间被利用了。然而,在多核系统中,两个或多个线程可能是真正同步执行的。 第9页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第9页。 线程的状态 线程有多种状态:线程可以处于运行(running)状态,只要获得CPU时间就准备运行。运行的线程可以被挂起(suspended),这会临时停止线程的活动。挂起的线程可以被恢复(resumed),从而允许线程从停止处恢复执行。当等待