注意:
1、用synchronized 来锁定一个对象的时候,如果这个对象在锁定代码段中被修改了,则这个锁也就消失了。看下面的实例:
目标类:
public class TestThread {
private static final class TestThreadHolder {
private static TestThread theSingleton = new TestThread();
public static TestThread getSingleton() {
return theSingleton;
}
private TestThreadHolder() {
}
}
private Vector ve =null;
private Object lock=new Object();
private TestThread(){
ve=new Vector();
initialize();
}
public static TestThread getInstance(){
return TestThreadHolder.getSingleton();
}
private void initialize(){
for(int i=0;i<100;i++){
ve.add(String.valueOf(i));
}
}
public void reload(){
synchronized(lock){
ve=null;
ve=new Vector();
//lock="abc";
for(int i=0;i<100;i++){
ve.add(String.valueOf(i));
}
}
System.out.println("reload end");
}
public boolean checkValid(String str){
synchronized(lock){
System.out.println(ve.size());
return ve.contains(str);
}
}
}
说明:在reload和checkValid方法中都增加了synchronized关键字,对lock对象进行加锁。在不同线程中对同一个对象实例分别调用reload和checkValid方法。
在reload方法中,不修改lock对象即注释lock="abc"; ,结果在控制台输出reload end后才输出100。说明是同步调用的。
如果在reload方法中修改lock对象即去掉注释,结果首先输出了一个数字(当前ve的大小),然后输出reload end。说明是异步调用的。
2、单例模式中对多线程的考虑
分享到:
相关推荐
一、synchronized 关键字的作用域 synchronized 关键字可以被用于两种范围内:对象实例和类范围。 1. 对象实例范围:synchronized 关键字可以被用于对象实例的方法上,以防止多个线程同时访问同一个对象的 ...
`synchronized`关键字可以修饰方法或用作代码块,其主要作用是控制对共享资源的并发访问,防止数据不一致和竞态条件。当一个线程进入`synchronized`代码块或方法时,其他试图进入同一块的线程将被阻塞,直到持有锁的...
二、`synchronized`的作用 1. **线程互斥**:当一个线程在执行`synchronized`代码时,其他线程必须等待该线程释放锁后才能进入。 2. **内存可见性**:确保线程在读取或修改共享变量时,能看到其他线程对变量的最新...
#### 四、使用建议 - 对于简单的状态变量(如标志位)的可见性保证,推荐使用`volatile`,因为它更轻量级且性能更好。 - 当需要实现互斥访问或复合操作的原子性时,应选择使用`synchronized`。 - 在不确定如何选择...
#### 四、synchronized的关键特性 1. **互斥性**:在同一时间,只有一个线程可以获得一个特定对象的锁。这意味着如果多个线程尝试访问同一对象的`synchronized`代码块或方法,则只有一个线程可以执行,其他线程将被...
#### 二、synchronized的作用机制 `synchronized`主要通过对象锁(也称为监视器锁)来实现其功能。当一个线程进入某个对象的一个`synchronized`代码块时,它会自动获得该对象的锁;离开该代码块时,则自动释放锁。...
Synchronized 同步锁的作用是解决多线程访问实例变量时可能造成的数据脏读现象。Synchronized 的使用方法有四种: 1. synchronized 修饰普通方法 2. synchronized 修饰普通代码块 3. synchronized 修饰静态方法 4. ...
在深入探讨`synchronized`的关键知识点之前,我们先来明确`synchronized`在Java中的核心作用:它是一种用于实现线程同步的机制,确保了共享资源在多线程环境下的正确访问和修改,避免了数据不一致性和竞态条件等问题...
#### 四、案例分析 假设有一个场景,需要为每个线程维护一个独立的计数器,而不希望线程之间互相影响。 1. **定义 ThreadLocal 类型的计数器:** ```java private static final ThreadLocal<Integer> ...
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 死锁...
1. **基本概念**:`synchronized`关键字可以作用于方法或代码块,用来声明同步区域。当一个线程进入同步区域时,会自动获得锁;离开时自动释放锁。 - **方法级同步**:直接在方法声明前使用`synchronized`,整个...
四、synchronized的特性与限制 1. 互斥性:在任意时刻,只有一个线程能够执行被`synchronized`修饰的代码。 2. 可见性:一个线程对共享变量的修改,对其他线程是立即可见的。 3. 等待/通知机制:在同步块中可以调用...
同步相量测量技术(Synchronized Phasor Measurements,简称SPM)是电力系统监测、分析与控制领域的一项关键技术。该技术通过高精度的时间同步机制(如全球定位系统GPS)实现了电网中各点电压和电流相量的精确测量,...
同步多媒体集成语言(Synchronized Multimedia Integration Language,简称SMIL,发音为“smile”),是一种基于XML的语言标准,用于创建交互式的多媒体演示。SMIL 3.0是该标准的第三个版本,它在前两个版本的基础上...
synchronized关键字可以用于实现线程同步,以下是使用synchronized的四种方式: 1. 作用在方法上,保证了访问同一个对象的同一个方法的线程同步 在Java中,使用synchronized关键字可以作用在方法上,从而保证了...
它的主要作用是确保同一时刻只有一个线程能够执行特定的代码块或方法,从而避免数据竞争问题。Synchronized有两种使用方式: 1. 在方法上使用:将`synchronized`关键字放在方法声明前,这将锁定整个方法,确保同一...
四、Synchronized的局限性与优化 尽管Synchronized提供了线程安全的保障,但其缺点也很明显,如可能导致死锁、性能开销较大等。在某些场景下,可以考虑使用其他并发控制机制,如ReentrantLock可重入锁、Semaphore...
四、synchronized 的使用方法 synchronized 的使用方法非常简单,只需将要保护的代码块括起来即可。例如: ```java public void syn(String userName) throws Exception { synchronized(userName) { // 保护的...
总结来说,`Synchronized`关键字在Java多线程编程中起到关键的同步作用,通过对象锁来确保共享资源的安全访问。然而,过度使用或不恰当使用可能导致程序并发性能下降。因此,合理地设计同步策略,结合其他并发工具如...