1. 使用synchronized关键字
(1) 同步方法
修饰对象实例方法
e.g.
- class A{
- private final byte[] INSTANCE_LOCK=new byte[0];
- synchronized void instanceMethod(){
- }
- }
- A a1 = new A();
- A a2 = new A();
- A a3=new A();
当多个线程调用a的方法instanceMethod时,同一时刻只有一个线程能执行
线程1执行a1. instanceMethod()
线程2执行a1. instanceMethod()
线程3执行a2. instanceMethod()
线程4执行a2. instanceMethod()
线程5执行a3. instanceMethod()
线程6执行a3. instanceMethod()
同一时刻线程1、2只有一个线程能执行a1. instanceMethod()
同一时刻线程3、4只有一个线程能执行a2. instanceMethod()
同一时刻线程5、6只有一个线程能执行a3. instanceMethod()
线程1(或2 )、3(或4)、5(或6)并不同步互斥
- synchronized void instanceMethod(){
- }
- //等价于
- void instanceMethod(){
- synchronized(this){
- }
- }
对象锁为当前的对象实例,如a1,a2,a3等
也可等价于
- void instanceMethod(){
- sysnchronized(INSTANCE_LOCK){
- }
- }
- //修饰类方法(静态方法)
- //e.g.
- class B{
- private static final byte[] CLASS_LOCK=new byte[0];
- synchronized static void classMethod(){
- }
- }
当多个线程调用B的静态方法classMethod(),同一时刻只有一个线程能执行
例如
B b1 = new B();
B b2 = new B();
B b3 = new B();
线程1执行b1. classMethod()或B.classMehoth()
线程2执行b2.classMethod()或B.classMehoth()
线程3执行b3.classMehtoed()或B.classMehoth()
同一时刻线程1、2、3只有一个线程能执行B.classMehoth()
- synchronized static void classMethod(){
- }
- //等价于
- void classMethod(){
- synchronized (B.class)
- }
- }
对象锁为当前的对象所属的类
也等价于
- void classMethon(){
- Synchronized(CLASS_LOCK){
- }
- }
注:获取对象锁之后便可以进入方法或代码块,当方法或代码执行完对象锁自动释放
(2) 同步代码块
- Object lock;
- synchronize(lock){
- //……
- }
拥有对象锁lock之后便可以进入代码块,代码执行完对象锁lock自动释放
2. wait()、notify()
Object lock;
1.lock.wait() 释放对象锁,并让当前线程(执行lock.wait()的线程)等待直到另一个线程调用lock.notify()
2.lock.notify() 唤醒其他线程(执行lock.wait()的线程)
使用wait()和notify()时,当前线程应该拥有对象锁
(the owner of this object's monitor)
- synchronized (lock){
- // 拥有对象锁进入代码块
- // do a
- lock.wait(); // 手动释放对象锁(让其他线程可以拥有对象锁),等待直到其他线程通知
- // 收到通知后do b
- }
- synchronized(lock){
- //拥有对象锁do c
- Lock.notify();// 通知等待线程执行(The awakenedthread will not be able to proceed until the current thread relinquishes thelock on this object)
- // 继续do d
- // 自动释放对象锁(唤醒的线程可以执行了)
- }
相关推荐
JAVA 编程题全集知识点总结 本资源提供了一个完整的 JAVA 编程题全集,涵盖了大量的题目和经典的解法,非常适合刷学完基础、刷题前的知识总结与开拓。以下是从资源中提取的重要知识点: 1. JAVA 基础知识:资源中...
Hbase JAVA编程开发实验报告以及代码,1 按照“Hbase应用开发实验1.pdf”中给出的说明,完成相关相关实验及JAVA程序的编写、调试和运行,提交JAVA源程序(AccessObject.java, HBaseTester.java, User.java)及运行...
通过以上内容的学习,学生将逐步建立起Java编程的知识框架,为后续更复杂的编程挑战做好准备。此外,课程还鼓励学生积极参与实践,通过实际编程项目来巩固所学,提高问题解决能力,最终形成具备职业竞争力的Java...
Java是一种广泛使用的高级编程语言,以其跨平台、安全性强...总的来说,这些题目覆盖了Java程序设计的基础概念,包括语法、面向对象、数据类型、控制流、数组以及类和对象的使用,是学习和理解Java编程的良好练习材料。
《高质量Java程序设计》是林锐的一本经典著作,它深入浅出地讲解了如何编写出高质量、可维护的Java程序。这本书对于Java开发者来说,是提升编程技能和理解Java精髓的重要参考资料。以下是对该书内容的一些关键知识点...
本资源“java程序设计例题全集”显然是一份涵盖了大学Java程序设计课程中各种实例的集合,旨在帮助学习者深入理解和掌握Java编程。 标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践...
作为Java编程的入门示例,"Hello World"程序展示了最基本的程序结构。在实验中,学生被要求使用EditPlus和Eclipse分别编写并运行这个程序,输出"Hello World"。通过这个简单的例子,学生可以理解Java程序的基本框架...
[Wrox] Java 编程面试揭秘 英文版 [Wrox] Java Programming Interviews Exposed E Book ☆ 图书概要:☆ If you are a skilled Java programmer but are concerned about the Java coding interview process ...
Java程序设计基础是编程学习的重要领域,主要涵盖了Java语言的基础概念、语法结构和特性。Java是一种全面面向对象的编程语言,由Sun公司的...这些内容构成了Java编程的基石,对于开发高效、可靠的软件系统至关重要。
该标签清晰地表明了该资源的主要内容是关于 JAVA 编程和程序设计的。该标签包括三个部分:java、开发、程序设计。 知识点: * JAVA 是一种编程语言,主要用于开发大型应用程序。 * JAVA 编程需要学习和掌握各种...
Java程序设计精讲课件是一套全面讲解Java编程的教育资源,主要涵盖了泛型、集合类、Java输入输出以及反射等核心概念。这套课程旨在帮助初学者深入理解和熟练掌握Java编程技术,同时也适合有一定基础的开发者进行知识...
在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的...
《Java程序设计》通过对Java编程语言的全面介绍,引导读者快速地掌握Java编程语言的核心内容并学会灵活运用所学的语言知识及面向对象的编程思想。《Java程序设计》共分12章,内容包括Java语言概述、面向对象编程初步...
《Java程序设计(第3版)》是唐大仕教授编著的一本深入浅出的Java编程教材,适合初学者和有一定经验的开发者学习。这本书的课件包含了丰富的教学资源,帮助读者更好地理解和掌握Java语言的核心概念和技术。下面将根据...
在Java编程中,我们首先需要了解基础语法,包括变量声明、数据类型(如整型、浮点型、字符型和布尔型)、运算符以及控制流程(如条件语句if-else、循环for、while和do-while)。这些构成了程序的基本骨架。 接着,...
本资源汇集了多个 Java 程序设计题目,涵盖了 Java 基础知识、控制结构、函数设计、面向对象编程等多方面的知识点。 1. Java 程序设计总复习题 1:编写一个 Java 程序在屏幕上输出“你好!”。本题目考察了 Java ...
Java编程入门是计算机编程语言Java的基础学习指南,它向初学者介绍了Java编程语言的核心概念和基础知识。这份资料特别强调了Java编程在手机游戏开发中的应用,但其内容并不局限于此,而是包含了更广泛的Java基础知识...
这本书通过丰富的实例和练习,引导读者逐步掌握Java编程的核心知识,培养解决问题和设计程序的能力。 1. **Java基础知识**:书中首先介绍了Java语言的基础,包括语法特性、数据类型、变量、运算符、流程控制语句...
Java 编程语言的第一个程序 一、Java 基础知识 Java 是一种高级语言,用于开发大型应用程序。Java 的第一个程序是学习 Java 的基础,了解 Java 的基本概念和结构是非常必要的。 二、JDK、JRE、JVM 的关系 JDK...