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中的多线程同步、互斥、联合、守护线程以及计时器线程(Timer)的相关知识点。 1. **线程同步**: 线程同步是控制不同线程对共享资源访问的过程,以避免数据不一致和竞态条件。Java提供了多种...
Java多线程编程是Java语言提供的一种基础的并发编程方式。在Java中,线程是一段执行的代码序列,可以与其他代码同时运行。多线程编程允许我们设计出可以同时执行多个任务的应用程序,这在进行诸如图像处理、文件操作...
在多线程中,有时需要确保某段代码在同一时刻只被一个线程执行,这称为同步。Java提供了synchronized关键字来实现同步。synchronized可以修饰方法或者用于同步代码块。 - synchronized方法: ```java public ...
在《java多线程并发编程核心技术应用实践》中,我们将深入探讨Java平台上的并发机制、线程安全与同步控制、线程池以及实战技巧。 首先,我们需要理解Java中的线程基础。线程是程序执行的最小单位,一个进程可以有多...
本章节主要讲解了Java多线程编程的基础知识,包括线程的概念模型、线程的创建和启动、临界资源、对象锁、线程的互斥和同步等内容。 一、线程的概念模型 在Java中,线程是程序中单个顺序的流控制,一个进程中可以...
本系列文章由MoreWindows撰写,涵盖了多线程编程的多个方面,包括...它不仅详细讲解了多线程同步互斥的各种技术,而且提供了多线程笔试面试题的解析,有助于加深对多线程编程的理解,帮助读者在笔试面试中取得好成绩。
在这个名为“线程同步的一个小程序”中,我们可以推测这是一段用于实验和理解线程同步机制的代码。下面我们将深入探讨线程同步的相关知识点。 线程同步的目的是确保在某一时刻只有一个线程可以访问特定的共享资源,...
2. **管程(Monitor)**:管程是一种在多线程环境中提供同步和互斥访问的机制,通常由Java的synchronized关键字实现。它保证同一时间只有一个线程能进入特定的代码段。 3. **消息传递**:线程通过发送消息进行通信...
- **Java中的synchronized关键字**:提供锁机制,确保同一时间只有一个线程执行某段代码。 - **Python的Lock对象**:提供类似的功能,防止多个线程同时访问同一资源。 5. **线程通信** - **生产者-消费者模型**...
2. **控制流**:Java中的流程控制语句包括条件语句(如if-else)和循环语句(如for、while和do-while),它们用于根据特定条件执行代码块或重复执行某段代码。 3. **方法(Method)**:方法是Java中实现功能的单元...
9. **多线程**:Java内置了对多线程的支持,可以通过实现Runnable接口或继承Thread类创建线程,理解线程同步和互斥是并发编程的关键。 10. **异常与错误**:Java将运行时问题分为异常和错误,异常可以通过编程方式...
- 多线程:在单个程序内部,同时执行多个不同的计算或任务。一个线程代表程序中的一个执行流,它由Java的`java.lang.Thread`类封装。 2. **线程与进程的区别**: - 进程:拥有独立的代码和数据空间,进程间的切换...
这些是编写任何程序的基础,用于根据条件执行特定代码块或重复执行某段代码。 4. **方法(Method)**:Java中的方法是实现功能的代码块,可以被其他部分调用。学习如何定义、调用和重载方法是重要的技能。 5. **...
多线程是指在一个程序中同时运行多个线程,而并发则涉及到多个任务或线程在同一时间段内交替执行。这两者都是为了提高系统的效率和资源利用率。 一、多线程 1. **定义**:多线程是在单个进程中创建多个执行线程的...
通过使用多线程,即使某个线程被阻塞,其他线程仍然可以继续执行。 - **简化程序设计**:多线程可以帮助将复杂的任务分解为多个简单的子任务,每个子任务可以在单独的线程中执行,使得程序结构更加清晰。 #### 创建...
2. **控制结构**:包括条件语句(if-else,switch-case)和循环语句(for,while,do-while),这些例子可能会展示如何根据特定条件执行代码或重复执行某段代码,是编写逻辑的重要工具。 3. **异常处理**:Java中的...
2. **控制流模板**:如if-else语句、for循环、while循环,展示了如何根据条件执行代码或重复执行某段代码。 3. **类与对象**:包含基础的类定义,如何声明属性和方法,以及如何实例化对象。 4. **继承与多态**:展示...
这些例子会演示如何根据特定条件执行代码块,以及如何重复执行某段代码,这对于编写逻辑复杂的程序至关重要。 3. **函数**:函数是代码的重用单元,Java中的方法就是函数的实现。通过例子,你可以学习如何定义和...