Understanding synchronized

2024-04-08 07:58

本文主要是介绍Understanding synchronized,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java synchronized详解

在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题。在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用。

synchronized 关键字,它包括两种用法:synchronized方法和synchronized块。  

一.synchronized 方法

通过在方法声明中加入 synchronized关键字来声明synchronized方法。如:public synchronizedvoid accessVal(int newVal);  每个类实例对应一把锁,每个synchronized方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员方法中至多只有一个处于可执行状态。

Java中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员方法声明为 synchronized  

对于静态方法来说,只要加上了synchronized关键字,这个方法就是同步的,无论是使用test.method(),还是使用Test.method()来调用method方法,method都是同步的,并不存在非静态方法的多个实例的问题。

二.synchronized

通过 synchronized关键字来声明synchronized块。语法如下:  
synchronized(syncObject) {  
      //
允许访问控制的代码  
}  

synchronized 块是这样一个代码块,其中的代码必须获得对象syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。  

synchronized(this)的一些理解 

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

·        当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。  

·        当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分(实例同步方法/同步块)的访问都被暂时阻塞。 

三.使用synchronized关键字时有以下四点需要注意:

1.    synchronized关键字不能继承

虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。

2.    在定义接口方法和抽象方法时不能使用synchronized关键字。

3.    构造方法不能使用synchronized关键字,但可以使用下节要讨论的synchronized块来进行同步。

4.    synchronized可以自由放置

在非静态方法中,synchronized可以放在方法定义的最前面,在静态方法中,synchronized可以放在static的前面,代码如下:

public synchronized void method(); 

synchronized public void method(); 

public static synchronized void method(); 

public synchronized static void method(); 

synchronized public static void method();

但要注意,synchronized不能放在方法返回类型的后面,如下面的代码是错误的:

public void synchronized method();

public static void synchronized method();


这篇关于Understanding synchronized的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885008

相关文章

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized

1,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized 都不可以,因为abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现,至于你的具体实现可以是native和synchronized,也可以不是,抽象方法是不关心这些事的,所以写这两个是没有意义的。然后,static方法是不会被覆

Understanding glibc malloc

https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/comment-page-1/

synchronized、volatile、Lock详解

在Java并发编程过程中,我们难免会遇到synchronized、volatile和lock,其中lock是一个类,而其余两个则是Java关键字。以下记录了小博开发过程中对这三者的理解,不足之处请多指教。 关于线程与进程请参考博文 以操作系统的角度述说线程与进程 synchronized   synchronized是Java中的关键字,是一种同步锁。有以下几种用法: 1、修饰方

从同—视角理解扩散模型(Understanding Diffusion Models A Unified Perspective)

从同—视角理解扩散模型 Understanding Diffusion Models A Unified Perspective【全公式推导】【免费视频讲解】 B站视频讲解 视频的论文笔记 从同一视角理解扩散模型【视频讲解笔记】 配合视频讲解的同步笔记。 整个系列完整的论文笔记内容如下,仅为了不用—一回复,共计14个视频讲解笔记,故设定了一个比较低的价格(粉丝仅6毛),大家可以自取。

Java中synchronized与java.util.concurrent.locks.Lock区别

相同点:Lock能完成synchronized所实现的所有功能 区别:Lock比synchronized更精确的线程语义和性能;chronized会自动释放锁,而Lock需要程序员手动释放,而且必须在finally从句中释放。Lock更强大的功能,如tryLock方法可以非阻塞方式去拿锁: import java.util.concurrent.locks.Lock;import jav

Java 关键字volatile 和synchronized的作用

1、什么是线程同步?   同步的字面意思是协同步调,就是按一定的顺序进行。线程同步通俗讲就是让多个线程按一定顺序对数据进行访问,在某个线程执行同步方法或进入临界区直到其返回,其它线程才能进入该同步方法或临界区。 2、什么是线程安全?   线程安全是指在多线程访问时,采用加锁机制,当前线程对该类的数据访问时,进行数据保护,其它线程暂时不能访问该类的数据,直到当前线程访问完毕,其它线程才能访问,

Java面试题:讨论synchronized关键字和java.util.concurrent包中的同步工具,如Lock和Semaphore

在 Java 中,synchronized 关键字和 java.util.concurrent 包中的同步工具都是用来控制多线程环境下的并发访问,以防止数据竞争和确保线程安全。下面是对 synchronized 关键字和 java.util.concurrent 包中的一些同步工具的讨论,包括它们的特点和使用场景。 synchronized 关键字 基本概念: synchronized 是 J

synchronized(this) 写法的利弊分析

synchronized(this) 写法的利弊分析 synchronized 关键字用于同步代码块,以确保在同一时间只有一个线程可以执行该代码块。synchronized(this) 是一种特殊的用法,它使用当前对象实例 (this) 作为锁。 public class Example {public void synchronizedMethod() {synchronized (this

多线程中synchronized作用

先看一个例子: //模仿火车售票系统,假设有4个售票点同时售票,我们可以把四个售票点定义为四个独立线程 class Test {  public static void main(String[] args)   {   TestThread tt=new TestThread();   new Thread(tt).start();        //每一个售票点定义为一个独立的线程,

synchronized在多线程中的使用

先看一个例子: //模仿火车售票系统,假设有4个售票点同时售票,我们可以把四个售票点定义为四个独立线程 class Test {  public static void main(String[] args)   {   TestThread tt=new TestThread();   new Thread(tt).start();        //每一个售票点定义为一个独立的线程,