引申:
对于这种多个实例,要想实现同步即输出的数字是有序并且按线程先后顺序输出,我们可以增加一个静态变量,对它进行加锁(后面将说明锁定的对象)。
修改目标类:
public class TestThread {
private static Object lock=new Object(); //必须是静态的。
public void execute(){
synchronized(lock){
for(int i=0;i<100;i++){
System.out.println(i);
}
}
}
}
二、同步代码块
public void method(SomeObject so){
synchronized(so)
//…..
}
}
锁定一个对象,其实锁定的是该对象的引用(object reference)
谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以按上面的代码写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它必须是一个对象)来充当锁(上面的解决方法就是增加了一个状态锁)。
a、锁定一个对象,它不是静态的
private byte[] lock = new byte[0]; // 特殊的instance变量
目标类:
public class TestThread {
private Object lock=new Object();
public void execute(){
synchronized(lock){ //增加了个锁,锁定了对象lock,在同一个类实例中,是线程安全的,但不同的实例还是不安全的。
因为不同的实例有不同对象锁lock
for(int i=0;i<100;i++){
System.out.println(i);
}
}
}
}
其实上面锁定一个方法,等同于下面的:
public void execute(){
synchronized(this){ //同步的是当然对象
for(int i=0;i<100;i++){
System.out.println(i);
}
}
}
分享到:
相关推荐
一、synchronized 关键字的作用域 synchronized 关键字可以被用于两种范围内:对象实例和类范围。 1. 对象实例范围:synchronized 关键字可以被用于对象实例的方法上,以防止多个线程同时访问同一个对象的 ...
`synchronized`关键字可以修饰方法或用作代码块,其主要作用是控制对共享资源的并发访问,防止数据不一致和竞态条件。当一个线程进入`synchronized`代码块或方法时,其他试图进入同一块的线程将被阻塞,直到持有锁的...
二、`synchronized`的作用 1. **线程互斥**:当一个线程在执行`synchronized`代码时,其他线程必须等待该线程释放锁后才能进入。 2. **内存可见性**:确保线程在读取或修改共享变量时,能看到其他线程对变量的最新...
#### 二、Java中的同步机制:synchronized与volatile 在Java中,为了保证多线程环境下数据的一致性和安全性,可以采用两种主要的方法:`synchronized`和`volatile`。 ##### 1. synchronized关键字 `synchronized`...
#### 二、synchronized的基本用法 `synchronized`关键字有两种主要的使用方式:一种是在方法声明中使用,另一种则是在代码块中使用。 ##### 1. synchronized方法 在方法声明中添加`synchronized`关键字,可以将...
#### 二、synchronized的作用机制 `synchronized`主要通过对象锁(也称为监视器锁)来实现其功能。当一个线程进入某个对象的一个`synchronized`代码块时,它会自动获得该对象的锁;离开该代码块时,则自动释放锁。...
Synchronized 同步锁的作用是解决多线程访问实例变量时可能造成的数据脏读现象。Synchronized 的使用方法有四种: 1. synchronized 修饰普通方法 2. synchronized 修饰普通代码块 3. synchronized 修饰静态方法 4. ...
### 二、`synchronized`的使用方式 #### 1. 修饰方法 当`synchronized`用于修饰实例方法时,其锁对象是当前对象的实例。这意味着在任意时刻,都只有一个线程可以访问该实例的所有`synchronized`方法,或者进入由`...
#### 二、ThreadLocal机制详解 **ThreadLocal** 提供了一种线程本地存储的解决方案,为每个线程创建独立的副本,避免了线程间的共享和争用问题。 - **作用原理:** - ThreadLocal 维护了一个 Map 结构,其中 Key ...
本文将详细探讨这两个概念及其在实现线程安全中的作用。 一、synchronized关键字 synchronized是Java中的一个关键同步机制,用于控制对类或对象的并发访问。它有两种使用方式:方法同步和代码块同步。 1. 方法...
#### 二、synchronized 关键字 `synchronized`关键字是Java提供的内置同步机制之一。它提供了一种简单的、面向对象的方式来实现线程间的同步操作。 1. **基本概念**:`synchronized`关键字可以作用于方法或代码块,...
一、synchronized关键字的作用与原理 `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时执行同一段代码,可能导致的数据不一致问题。 1. 同步方法:当在方法...
同步相量测量技术(Synchronized Phasor Measurements,简称SPM)是电力系统监测、分析与控制领域的一项关键技术。该技术通过高精度的时间同步机制(如全球定位系统GPS)实现了电网中各点电压和电流相量的精确测量,...
例如,在文档中提到的第一个示例中,`run()`方法被`synchronized`修饰,但由于`t1`和`t2`是基于不同对象`r1`和`r2`的线程,它们实际上访问的是不同的数据,因此`synchronized`在这个例子中没有起到同步的作用。...
同步多媒体集成语言(Synchronized Multimedia Integration Language,简称SMIL,发音为“smile”),是一种基于XML的语言标准,用于创建交互式的多媒体演示。SMIL 3.0是该标准的第三个版本,它在前两个版本的基础上...
在第二个示例中,我们对累加操作的循环使用了`synchronized`代码块,锁定对象为`SynchronizedDemo.class`。这意味着在任何时候只有一个线程能够执行这段同步代码,确保了线程安全。每个线程在执行前都需要获取到类...
它的主要作用是确保同一时刻只有一个线程能够执行特定的代码块或方法,从而避免数据竞争问题。Synchronized有两种使用方式: 1. 在方法上使用:将`synchronized`关键字放在方法声明前,这将锁定整个方法,确保同一...