`

Java中synchronized 关键字的详解

阅读更多

 

在了解cache的过程中,难免会涉及多线程的问题,涉及到多线程问题,自然会涉及互斥问题。在啥地方加锁,如何加锁才能提高效率。于是,本篇文章针对互斥问题,做一下深入的研究。

 

java中,采用关键字synchronized进行同步互斥,而synchronized的同步是互斥锁,有同步方法和同步代码块,下面就synchronized做一下详细的总结。

 

1、同步方法 synchronized aMethod(){ }方法

 

1) 在一个类中可能会包含一个或多个synchronized 的方法,其作用域范围有实例对象内的,也有类范围的。

 

对于实例对象范围的同步方法,其定义为 synchronized aMethod(){ }。 该同步方法可以防止多个线程同时访问该对象的synchronized方法。如果一个实例对象中有多个synchronized 方法,只要有一个线程访问其中一个synchronized方法,则其他线程不能同时访问这个对象的任何一个synchronized 方法。其实这种情况下,加锁不是对方法加锁,而是对对象进行加锁。但不同的实例对象的synchronized 方法是不受干扰的,即其他线程可以同时访问相同类的另一个实例对象中的synchronized 方法。

 

    对于类范围的同步方法,其定义为 synchronized static aMethod(){ }。该同步方法可以防止多个线程同时访问这个类的synchronized 方法,它会对类的所有对象实例起作用。

 

2synchronized的方法是不能继承的。

 

也就是说基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。

 

2、同步代码块 synchronized(this)

 

1)当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。但另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

 

2)当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞,这一点和synchronized方法是相同的。其实下面两段代码是等同的。

Public synchronized void methodAAA()
{
 
    //…. 
}

等同于下面代码

public void methodAAA()
{
 
     synchronized (this){
  
       //…
 
     }
}

 

3、无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁,而且同步方法很可能还会被其他线程的对象访问。

 

分享到:
评论

相关推荐

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

    Java多线程synchronized关键字详解(六)共5页.pdf.zip

    synchronized关键字的用法详解

    synchronized关键字在java中的重要性 以及常用的方法 还有它的详解

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

    主要介绍了Java 多线程synchronized关键字详解(六)的相关资料,需要的朋友可以参考下

    详解Java中synchronized关键字的死锁和内存占用问题

    Java的synchronized关键字用来进行线程同步操作,然而这在使用中经常会遇到一些问题,这里我们就来详解Java中synchronized关键字的死锁和内存占用问题:

    Java中synchronized关键字修饰方法同步的用法详解

    synchronized可以用来同步静态和非静态方法,下面就具体来看一下Java中synchronized关键字修饰方法同步的用法详解:

    java关键字Synchronized详解

    ava中的关键字synchronized是一种用于实现线程同步的机制。它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下的数据竞争和不一致问题。 在Java中...

    java多线程编程之Synchronized关键字详解

    主要为大家详细介绍了java多线程编程之Synchronized关键字,感兴趣的朋友可以参考一下

    Java中的关键字synchronized 详解

    主要介绍了Java中的关键字synchronized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    详解java中的synchronized关键字

    主要介绍了java中的synchronized关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码,感兴趣的小伙伴们可以参考一下

    java_synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

    实例解析Java中的synchronized关键字与线程安全问题

    synchronized代码块,被修饰的代码成为同步语句块,其作用的范围是调用这个代码块的对象,我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步。...

    Java——volatile关键字详解

    volatile是比synchronized关键字更轻量级的同步机制,访问volatile变量时不会执行加锁操作,因此不会使执行线程阻塞。 volatile保证可见性和禁止指令重排序,底层是通过“内存屏障”来实现,但不保证原子性。 写入...

    java-synchronized详解.doc

    本文档主要讲述的是java synchronized详解;Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

    Java synchronized 详解.docx

    synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...

    Java 中 synchronized的用法详解(四种用法)

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    Java 多线程与并发(4_26)-关键字_ synchronized详解

    java synchronized用法详解

    本篇文章主要介绍了java synchronized用法详解,synchronized是Java中的关键字,是一种同步锁。有兴趣的同学可以了解一下。

    JAVA synchronized详解

    记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    第二部分引入了ClassLoader,这是因为ClassLoader与线程不无关系,我们可以通过synchronized关键字,或者Lock等显式锁的方式在代码的编写阶段对共享资源进行数据一致性保护,那么一个Class在完成初始化的整个过程到...

Global site tag (gtag.js) - Google Analytics