`
xieyj
  • 浏览: 102778 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

synchronized错误用法

阅读更多

    翻起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 关键字是解决线程安全问题的重要手段,它可以确保在多线程环境下,共享资源的访问安全性。本文将详细介绍 Java 中 synchronized 的正确使用方法,通过...

    Android synchronized 测试案例

    本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及成功与失败的场景对比。 一、`synchronized`关键字的基本概念 `synchronized`关键字可以修饰方法或用作代码块,其主要作用是...

    Java使用synchronized修饰方法来同步线程的实例演示

    本文将深入探讨synchronized修饰方法在Java中的使用及其工作原理,并通过实例演示其应用。 1. **synchronized原理** synchronized基于Java的内置锁(也称为对象锁或 monitors)机制。当一个线程进入synchronized...

    synchronized与单例的线程安全

    1. 方法同步:通过在方法声明前加上`synchronized`关键字,整个方法体将被锁定,一次只有一个线程可以执行该方法。例如: ```java public synchronized void method() { // 代码 } ``` 2. 代码块同步:针对特定...

    Java并发编程系列- synchronized

    这意味着,当一个线程正在执行这个实例的`synchronized`方法时,其他线程试图调用该实例的任何其他`synchronized`方法都会被阻塞,直到当前线程完成方法的执行。 2. **修饰静态方法**:如果`synchronized`修饰的是...

    Java 多线程synchronized关键字详解(六)

    在这个问题中,我们将深入理解`synchronized`的关键字用法,包括同步方法和同步块。 1. **同步方法**: 当`synchronized`关键字修饰一个方法时,这个方法称为同步方法。这意味着当一个线程进入这个方法时,它会...

    Java synchronized关键字使用方式及特性解析

    Javaynchronized关键字使用方式及特性解析 Java中的synchronized关键字是一种实现锁的方式,它是在JVM层面实现的非公平锁。...但是,需要正确地使用synchronized关键字,以避免出现不必要的错误。

    并发synchronized详解.pdf

    synchronized 有三种用法:同步实例方法、同步类方法和同步代码块。每个同步对象都有一个自己的 Monitor,与之关联,当且一个 Monitor 被持有后,它将处于锁定状态。 synchronized 的实现原理是基于进入和退出 ...

    并发编程之JMM&synchronized&volatile详解.pdf

    synchronized可以修饰方法或者作为代码块使用,对对象实例或类级别的变量进行锁定。 并发编程的优缺点: 优点: 1. 提高资源利用率:允许多个任务同时执行,充分利用CPU资源。 2. 响应速度:通过并发执行,可以快速...

    同步代码块(synchronized).zip

    在Java编程语言中,同步...理解并熟练使用`synchronized`关键字是Java多线程编程的基础,对于开发高效且线程安全的程序至关重要。在实际工作中,我们需要根据具体需求灵活运用同步代码块,以确保系统的正确性和稳定性。

    Java使用synchronized实现互斥锁功能示例

    在本文中,我们将通过实例形式剖析Java使用synchronized实现互斥锁功能的简单实现方法与操作技巧。 一、synchronized关键字概述 synchronized关键字是Java语言中的一种同步机制,用于控制多个线程访问共享资源的...

    详解iOS多线程之2.NSThread的加锁@synchronized

    在编写多线程代码时,特别是在涉及到共享状态或数据修改时,使用`synchronized`或其他同步机制是至关重要的,以防止数据不一致和程序错误。然而,需要注意的是,过度使用`synchronized`可能导致线程阻塞,影响程序...

    今天会是有Offer的一天么:面试时不要再问我CAS和Synchronized的区别了

    2. **锁的类型**:synchronized可以作用于方法和代码块,对于普通方法,锁是当前实例对象;对于静态方法,锁是当前类的Class对象;对于同步代码块,锁是Synchonized括号内的对象。 3. **实现方式**:synchronized在...

    java Thread & synchronized & concurrent 线程、同步、并发

    当一个方法或代码块被`synchronized`修饰时,同一时间只有一个线程可以执行这段代码。这样保证了对共享资源的互斥访问,防止数据错误。例如,在`TestSync.java`中可能会包含这样的同步代码: ```java public ...

    浅析java并发中的Synchronized关键词

    浅析Java并发中的Synchronized关键词 Java并发编程中,Synchronized关键词是一个非常重要的概念,它提供了一种...通过使用Synchronized关键词,可以保护共享资源,避免了线程安全问题,保证了多线程环境中的安全性。

    synchronize.pdf

    标题 "synchronize.pdf" 和描述 "synchronize详解" 显示该文档专注于Java编程语言中关键字 synchronized 的使用和机制。Synchronized 关键字是Java中用于控制多线程并发访问共享资源的一个核心关键字,确保同一时间...

    审查Java代码的十一种常见错误

    ### 审查Java代码的十一种常见错误 在软件开发过程中,代码审查是确保软件质量的重要环节之一。本文将详细介绍审查Java代码时常见的十一种错误,并提供...接下来的几节将继续介绍更多常见的Java代码错误及其解决方法。

    Java业务开发常见错误.zip

    文档可能详细解释了常见的错误用法,如并发修改异常、未初始化的列表引用、遍历时修改列表等,并提供了最佳实践。 "加餐1丨带你吃透课程中Java8的那些重要知识点(上).pdf"涵盖了Java 8的新特性。Java 8引入了...

Global site tag (gtag.js) - Google Analytics