`
san_yun
  • 浏览: 2663453 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Thread之synchronized

    博客分类:
  • java
阅读更多
synchronized(this) {

}
---------------------------------------------
Object lock = new Object();
synchronized(lock ) {

}
---------------------------------------------
synchronized(XXX.class ) {

}

之前对三种写同步有什么区别一直不是很理解,今天想了一下
其实也很好理解,每种同步都需要一种锁来实现同步机制。第一种和在成员方法前面加
synchronized 是一致的,本意是在this对象上面加锁,这样的效果就是如果有多个synchronized 方法的话,只能响应其中一个synchronized 方法。
class Boo {
       
    public void test1() {
        synchronized(this){
            try {
                System.out.println("test1 sleep...........");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            } finally {
                System.out.println("exit test1()");
            }
        }
    }

    public synchronized void test2() {
        System.out.println("test2()");
    }
    
}


out:
test1 sleep...........
exit test1()
test2()

当我们有一个Thread访问Boo .test1()的时候进入同步状态,其他所有的synchronized this对象级别的方法都会进入阻塞状态,其他线程不但不能访问test1(),test2()也不能访问。

所以要谨慎使用synchronized this,其中就出现了一个故障:blog服务器不定时的报警。

原因:文章的cache dao的多个方法都采用了syncronized(this)块同步,而cache dao是singleton,这样锁就是唯一的锁,当一个线程访问cache dao的一个synchronized(this)同步代码块时,其他线程对该对象中所有其它synchronized(this)同步代码块的访问将被阻塞。

类似于this锁,synchronized(XXX.class ) 会在类上面加锁,这样会导致所有的static synchronized会被阻塞。

而Object lock = new Object();会在lock 上面加锁,这样导致所有访问这个lock 锁的synchronized块被阻塞。

一言以蔽之,同步分三个级别,类级别,对象级别,局部变量级别。类级别的同步阻塞所有的static方法,对象级别的同步阻塞所有实例方法,局部变量级别的同步阻塞当前线程访问的方法。
分享到:
评论

相关推荐

    java_synchronized详解

    `synchronized`是Java语言提供的关键字之一,用于实现线程间的同步控制。通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个线程能访问这些代码区域,从而有效避免了多线程环境下的数据竞争和不一致...

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

    在Java编程语言中,线程(Thread)、同步(synchronized)和并发(Concurrency)是核心概念,它们在多任务处理和高效系统设计中扮演着重要角色。本文将深入探讨这三个主题,以及它们如何相互作用以确保程序的正确性...

    JAVA synchronized详解

    `synchronized`关键字是Java中实现线程安全的重要手段之一。通过将方法或代码块声明为同步,可以有效地防止多线程环境下可能出现的数据竞争和不一致性问题。需要注意的是,虽然`synchronized`能够提供强大的同步能力...

    java里面synchronized用法.doc

    Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized 用法进行详细的解释和分析。 一、...

    synchronized 的理解

    在深入探讨`synchronized`的关键知识点之前,我们先来明确`synchronized`在Java中的核心作用:它是一种用于实现线程同步的机制,确保了共享资源在多线程环境下的正确访问和修改,避免了数据不一致性和竞态条件等问题...

    synchronized关键字的用法详解

    `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多线程环境中有效地控制对共享资源的访问,避免出现数据不一致的情况。 #### ...

    java synchronized 学习

    Java synchronized 学习 Java 中的 synchronized 关键字是用来实现线程同步的,它可以用来修饰方法、代码块和静态方法,以确保在多线程环境下数据的一致性。 一、进程和线程的区别 在计算机中,每个运行着的 xxxx...

    Synchronized与ThreadLocal

    ### Synchronized与ThreadLocal #### 一、Synchronized机制详解 **Synchronized** 是 Java 中一个非常重要的关键字,主要...这正是 ThreadLocal 的强大之处,它提供了一种简单而高效的方式来处理线程局部变量的问题。

    synchronized详解

    System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread ta = new Thread(t1, "A"); ...

    ReentrantLock与synchronized

    - 无法中断正在等待获取锁的线程,除非抛出异常或者调用`Thread.interrupt()`。 - 不能知道哪个线程持有锁,也无法知道锁的状态。 **二、ReentrantLock** 1. **类库特性**: - `ReentrantLock`是Java并发包`...

    深入理解java中的synchronized关键字

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够保持数据的一致性和完整性。本文将深入探讨`synchronized`的两种主要用法:synchronized方法和...

    java-synchronized详解.doc

    例子一展示了两个线程分别启动,它们都尝试访问同一个`Thread1`实例的`synchronized`方法。由于每次只有一个线程能执行同步代码,因此可以看到线程A先完成其循环,然后线程B才开始执行。 例子二展示了即使在一个...

    Java线程及同步(synchronized)样例代码

    `synchronized`是Java中用于实现线程同步的重要关键字之一。它可以修饰方法或代码块,保证同一时刻只有一个线程能够访问被修饰的部分,从而实现对共享资源的保护。当一个对象的实例方法或静态方法被`synchronized`...

    Java Thread用法 经典

    在Java编程语言中,线程是程序执行的基本单位之一,它能够帮助我们实现多任务处理,提高程序运行效率。Java中的线程主要通过`java.lang.Thread`类来创建和管理。 #### 二、线程创建方式 在Java中,可以通过以下两...

    解析Java编程之Synchronized锁住的对象

    Java synchronized锁住的对象解析 在Java编程中,synchronized关键字是用于同步的关键字,它可以用于锁住一个对象,以实现线程同步。但是,在使用synchronized关键字时,需要了解锁住的到底是哪个对象,否则可能...

    java多线程编程之Synchronized块同步方法

    `synchronized`关键字依赖于监视器对象(Monitor),每个对象都有一个与之关联的内置锁。当线程进入`synchronized`方法或同步代码块时,它会获取该对象的锁,其他线程必须等待锁被释放才能继续执行。 5. **可重入...

    java synchronized关键字原理、自定义一把锁来实现同步等

    `synchronized` 是 Java 中的关键字之一,用于实现线程间的同步控制,确保共享资源的安全访问。它主要应用于以下两种场景: 1. **同步方法**:在类的方法声明前加上 `synchronized` 关键字,则该方法成为同步方法。...

Global site tag (gtag.js) - Google Analytics