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

相关文章

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

面试官:synchronized的锁升级过程是怎样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 回答 在 JDK 1.6之前,synchronized 是一个重量级、效率比较低下的锁,但是在JDK 1.6后,JVM 为了提高锁的获取与释放效,,对 synchronized 进行了优化,引入了偏向锁和轻量级锁,至此,锁的状态有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁。 锁升级就是无锁 —>

Understanding the GitHub Flow

这里看下Github的入门介绍    --链接 GitHub Flow is a lightweight, branch-based workflow that supports teams and projects where deployments are made regularly. This guide explains how and why GitHub Flow works

【Java编程的思想】理解synchronized

用法和基本原理 synchronized可以用于修饰类的实例方法、静态方法和代码块 实例方法 在介绍并发基础知识的时候,有一部分是关于竞态条件的,当多个线程访问和操作同一个对象时,由于语句不是原子操作,所以得到了不正确的结果。这个地方就可以用synchronized进行处理 public class Counter {private int count;public synchroni

【大数据Java基础- Java并发 20】深入分析synchronized的实现原理

记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 诚然,随着Javs S

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

java线程锁 synchronized

//java锁是对同一个对象或者同一个对象中的方法加锁;关键是同一个 错误的加锁方式 public class MyWaitNotify { public static void main(String[] args) { MyT m1=new MyT("A"); MyT m2=new MyT("B"); m1.start(); m2.start(); } } class MyT

java synchronized原理与 为何锁升级及过程

关于锁升级 java1.6之前Syntronized 没有锁升级概念,只有重量锁:即用户态和内核态的上下文切换 会比较浪费时间。 java1.6之后,Syntronized关键字 开始有锁升级的概念,即偏向锁,轻量级锁,重量级锁。   注意CAS不是自旋锁,(CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。)

多线程 | synchronized的简单使用

synchronized 关键字是 Java 中解决并发问题的一种常用方法,也是最简单的一种方法,其作用有三个: (1)互斥性:确保线程互斥的访问同步代码 (2)可见性:保证共享变量的修改能够及时可见 (3)有序性:有效解决重排序问题, 其用法也有三个: 修饰实例方法修饰静态方法修饰代码块 修饰实例方法 public class SynchronizedInstanceMethod impl

线程同步(synchronized关键字)

概念 解决数据共享问题,必须使用同步,所谓同步就是指多个线程在同一时间段内只能有一个线程执行代码,其他线程要等待此线程完成之后才可以继续执行。 方法 线程进行同步,有以下两种方法: (1)同步代码块 synchronized(要同步的对象){ 要同步的操作; } (2)同步方法 public synchronized void method(){ 要同步的操作; } 同步代