iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >synchronized关键字 - [JAVA心得]
  • 241
分享到

synchronized关键字 - [JAVA心得]

2023-06-03 01:06:34 241人浏览 安东尼
摘要

Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized关键字的作用进行深入了解才可定论。   总的说来,synchr

Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized关键字的作用进行深入了解才可定论。

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

  在进一步阐述之前,我们需要明确几点:

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

  B.每个对象只有一个锁(lock)与之相关联。

  C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。[@more@]

  接着来讨论synchronized用到不同地方对代码产生的影响:

  假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。

  1.把synchronized当作函数修饰符时,示例代码如下:


Public synchronized void methodAAA()
{

//….

}


  这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了 synchronized关键字的方法。

  上边的示例代码等同于如下代码:


public void methodAAA()
{

synchronized (this) // (1)

{
//…..
}

}


  (1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱

  2.同步块,示例代码如下:


public void method3(SomeObject so)

{

synchronized(so)

{
//…..
}

}


  这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:


class Foo implements Runnable

{

private byte[] lock = new byte[0]; // 特殊的instance变量

Public void methodA()

{

synchronized(lock) { //… }

}

//…..

}


  注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。

  3.将synchronized作用于static 函数,示例代码如下:


Class Foo

{

public synchronized static void methodAAA() // 同步的static 函数

{

//….

}

public void methodBBB()

{

synchronized(Foo.class) // class literal(类名称字面常量)

}

}


  代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

  记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。

  可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj所属的那个Class,而B的锁是Obj这个对象。

  小结:

  搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。

  还有一些技巧可以让我们对共享资源的同步访问更加安全:

  1. 定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。这也是JavaBean的标准实现方式之一。

  2.如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance 对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。

--结束END--

本文标题: synchronized关键字 - [JAVA心得]

本文链接: https://www.lsjlt.com/news/232005.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • synchronized关键字 - [JAVA心得]
    Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized关键字的作用进行深入了解才可定论。   总的说来,synchr...
    99+
    2023-06-03
  • Java中的synchronized关键字
    目录1、synchronized锁的底层实现原理2、基于synchronized实现单例模式3、利用类加载实现单例模式(饿汉模式)1、synchronized锁的底层实现原理 JV...
    99+
    2024-04-02
  • Java 关键字:synchronized详解
    synchronized详解 基本使用源码解析常见面试题好书推荐 基本使用 Java中的synchronized关键字用于在多线程环境下确保数据同步。它可以用来修饰方法和代码块 当一...
    99+
    2023-10-20
    java 开发语言 并发编程 JUC synchronized 原力计划
  • synchronized 关键字
    文章目录 一、synchronized 的特性互斥可重入 二、 synchronized 使用示例三、 java标准库的线程安全类四、 死锁可重入死锁相互争夺锁哲学家就餐问题死锁的四个必...
    99+
    2023-09-04
    java 开发语言 操作系统
  • Java中的synchronized关键字怎么用
    小编给大家分享一下Java中的synchronized关键字怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、synchronized锁的底层实现原理JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。...
    99+
    2023-06-25
  • 【JavaEE】Java中复杂的Synchronized关键字
    目录  一、synchronized的特性 (1)互斥 (2)刷新内存 (3)可重入 二、synchronized的使用 (1)修饰普通方法 (2)修饰静态方法 (3)修饰代码块 三、synchronized的锁机制 (1)基本特点 (2)...
    99+
    2023-09-04
    java java-ee 开发语言 jvm 面试
  • JAVA中native方法与synchronized 关键字
    native , synchronized [@more@]JAVA中native方法 @与羊共舞的狼 Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件...
    99+
    2023-06-03
  • Java多线程并发synchronized 关键字
    目录基础修饰普通方法修饰静态方法Synchronized 加锁原理monitorentermonitorexitsynchronized 修饰静态方法优点、缺点及优化其他说明基础 J...
    99+
    2024-04-02
  • Java synchronized同步关键字工作原理
    目录一、简介二、synchronized的特性三、synchonized的使用及通过反汇编分析其原理修饰代码块monitorenter指令monitorexit指令修饰普通方法修饰静...
    99+
    2023-02-13
    Java synchronized Java synchronized原理
  • 如何在Java中使用synchronized关键字
    如何在Java中使用synchronized关键字?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类...
    99+
    2023-06-14
  • Java多线程之synchronized关键字的使用
    目录一、使用在非静态方法上二、使用在静态方法上三、使用在代码块上四、三种方式的区别4.1 不会互斥4.2 互斥一、使用在非静态方法上 public synchronized vo...
    99+
    2024-04-02
  • Java多线程synchronized关键字怎么输出
    这篇文章主要介绍“Java多线程synchronized关键字怎么输出”,在日常操作中,相信很多人在Java多线程synchronized关键字怎么输出问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java多...
    99+
    2023-06-17
  • 如何掌握Synchronized关键字
    这篇文章主要讲解了“如何掌握Synchronized关键字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何掌握Synchronized关键字”吧!一、sy...
    99+
    2024-04-02
  • Java多线程并发编程 Synchronized关键字
    synchronized 关键字解析同步锁依赖于对象,每个对象都有一个同步锁。现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的同步锁,同时,线程 B 也去调用 Test ...
    99+
    2023-05-31
    java synchronized 关键字
  • Java中关键字synchronized的使用方法详解
    synchronized是Java里的一个关键字,起到的一个效果是“监视器锁”~~,它的功能就是保证操作的原子性,同时禁止指令重排序和保证内存的可见性! public clas...
    99+
    2024-04-02
  • java线程安全Synchronized关键字怎么使用
    这篇文章主要介绍“java线程安全Synchronized关键字怎么使用”,在日常操作中,相信很多人在java线程安全Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jav...
    99+
    2023-06-04
  • java中synchronized关键字的3种写法实例
    目录预备知识写法一:修饰代码块 写法二:修饰方法写法三:修饰静态方法synchronized原理1. monitor锁定过程2. synchronized锁3. synchroniz...
    99+
    2024-04-02
  • Java关键字synchronized原理与锁的状态详解
    目录一、Java中锁的概念二、同步关键字synchronized特性1、锁消除示例2、锁粗化示例三、synchronized关键字原理1、关于Mark Word2、锁的状态变化(1)...
    99+
    2022-11-13
    Java synchronized Java
  • 浅析Java关键词synchronized的使用
    目录1 引入Synchronized2 Synchronized的使用2.1 对象锁2.2 类锁3 Synchronized原理分析3.1 虚拟机如何辨别和处理synchronize...
    99+
    2022-12-30
    Java关键词synchronized Java synchronized
  • Java中怎么利用synchronized关键字实现同步机制
    Java中怎么利用synchronized关键字实现同步机制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的synchronized使用方法总结1.  把sy...
    99+
    2023-06-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作