翻起tomcat5的源码,看到standardServer.java中的addservice方法:
public void addService(Service service) {
service.setServer(this);
synchronized (services) {
Service results[] = new Service[services.length + 1];
System.arraycopy(services, 0, results, 0, services.length);
results[services.length] = service;
services = results; ---此处会导致同步失效,因为改写了锁的对象,也就是锁指向的区域发生了改变
if (initialized) {
try {
service.initialize();
} catch (LifecycleException e) {
e.printStackTrace(System.err);
}
}
if (started && (service instanceof Lifecycle)) {
try {
((Lifecycle) service).start();
} catch (LifecycleException e) {
;
}
}
// Report this property change to interested listeners
support.firePropertyChange("service", null, service);
}
}
由于Thread.Sleep()不会失去拥有的对象锁,做个例子验证一下
public class Test {
private static Object lock = new Object();
public static void main(String[] args) {
new Thread(){
public void run() {
synchronized (lock) {
System.out.println("thread1-----enter");
lock = new Object() ; //更换锁的对象
try {
Thread.sleep(3000); //让线程2可以运行,看是否能进入代码块
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1-----exit");
}
}
}.start();
new Thread(){
public void run() {
try {
Thread.sleep(1000);//让上面的线程1先进入同步代码块
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock) {
System.out.println("thread2-----enter");
System.out.println("thread2-----exit");
}
}
}.start();
}
}
输出的结果为
thread1-----enter
thread2-----enter
thread2-----exit
thread1-----exit
可见上面的同步失败,连写tomcat的大牛都出错,synchronized的坑真不小。
相关推荐
Java 中 synchronized 正确使用方法解析 Java 中 synchronized 关键字是解决线程安全问题的重要手段,它可以确保在多线程环境下,共享资源的访问安全性。本文将详细介绍 Java 中 synchronized 的正确使用方法,通过...
本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及成功与失败的场景对比。 一、`synchronized`关键字的基本概念 `synchronized`关键字可以修饰方法或用作代码块,其主要作用是...
本文将深入探讨synchronized修饰方法在Java中的使用及其工作原理,并通过实例演示其应用。 1. **synchronized原理** synchronized基于Java的内置锁(也称为对象锁或 monitors)机制。当一个线程进入synchronized...
1. 方法同步:通过在方法声明前加上`synchronized`关键字,整个方法体将被锁定,一次只有一个线程可以执行该方法。例如: ```java public synchronized void method() { // 代码 } ``` 2. 代码块同步:针对特定...
这意味着,当一个线程正在执行这个实例的`synchronized`方法时,其他线程试图调用该实例的任何其他`synchronized`方法都会被阻塞,直到当前线程完成方法的执行。 2. **修饰静态方法**:如果`synchronized`修饰的是...
在这个问题中,我们将深入理解`synchronized`的关键字用法,包括同步方法和同步块。 1. **同步方法**: 当`synchronized`关键字修饰一个方法时,这个方法称为同步方法。这意味着当一个线程进入这个方法时,它会...
Javaynchronized关键字使用方式及特性解析 Java中的synchronized关键字是一种实现锁的方式,它是在JVM层面实现的非公平锁。...但是,需要正确地使用synchronized关键字,以避免出现不必要的错误。
synchronized 有三种用法:同步实例方法、同步类方法和同步代码块。每个同步对象都有一个自己的 Monitor,与之关联,当且一个 Monitor 被持有后,它将处于锁定状态。 synchronized 的实现原理是基于进入和退出 ...
synchronized可以修饰方法或者作为代码块使用,对对象实例或类级别的变量进行锁定。 并发编程的优缺点: 优点: 1. 提高资源利用率:允许多个任务同时执行,充分利用CPU资源。 2. 响应速度:通过并发执行,可以快速...
在Java编程语言中,同步...理解并熟练使用`synchronized`关键字是Java多线程编程的基础,对于开发高效且线程安全的程序至关重要。在实际工作中,我们需要根据具体需求灵活运用同步代码块,以确保系统的正确性和稳定性。
在本文中,我们将通过实例形式剖析Java使用synchronized实现互斥锁功能的简单实现方法与操作技巧。 一、synchronized关键字概述 synchronized关键字是Java语言中的一种同步机制,用于控制多个线程访问共享资源的...
在编写多线程代码时,特别是在涉及到共享状态或数据修改时,使用`synchronized`或其他同步机制是至关重要的,以防止数据不一致和程序错误。然而,需要注意的是,过度使用`synchronized`可能导致线程阻塞,影响程序...
2. **锁的类型**:synchronized可以作用于方法和代码块,对于普通方法,锁是当前实例对象;对于静态方法,锁是当前类的Class对象;对于同步代码块,锁是Synchonized括号内的对象。 3. **实现方式**:synchronized在...
当一个方法或代码块被`synchronized`修饰时,同一时间只有一个线程可以执行这段代码。这样保证了对共享资源的互斥访问,防止数据错误。例如,在`TestSync.java`中可能会包含这样的同步代码: ```java public ...
浅析Java并发中的Synchronized关键词 Java并发编程中,Synchronized关键词是一个非常重要的概念,它提供了一种...通过使用Synchronized关键词,可以保护共享资源,避免了线程安全问题,保证了多线程环境中的安全性。
标题 "synchronize.pdf" 和描述 "synchronize详解" 显示该文档专注于Java编程语言中关键字 synchronized 的使用和机制。Synchronized 关键字是Java中用于控制多线程并发访问共享资源的一个核心关键字,确保同一时间...
### 审查Java代码的十一种常见错误 在软件开发过程中,代码审查是确保软件质量的重要环节之一。本文将详细介绍审查Java代码时常见的十一种错误,并提供...接下来的几节将继续介绍更多常见的Java代码错误及其解决方法。
文档可能详细解释了常见的错误用法,如并发修改异常、未初始化的列表引用、遍历时修改列表等,并提供了最佳实践。 "加餐1丨带你吃透课程中Java8的那些重要知识点(上).pdf"涵盖了Java 8的新特性。Java 8引入了...