热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

Javasynchronized是如何工作的

1.为什么需要synchronizationJava是多线程的编程语言,所以对java对象或者javaclass进行同步是非常重要的。在java中实现同步的方法可以采用java关键字synchronized或者violate在java多线程的环境中,也不是所有的东西都需要synchronization.比如,

1. 为什么需要synchronization Java是多线程的编程语言, 所以对java对象或者java class进行同步是非常重要的。 在java中实现同步的方法可以采用java 关键字synchronized或者 violate 在java多线程的环境中, 也不是所有的东西都需要synchronization. 比如,

1. 为什么需要synchronization

Java是多线程的编程语言, 所以对java对象或者java class进行同步是非常重要的。 在java中实现同步的方法可以采用java 关键字synchronized或者 violate

在java多线程的环境中, 也不是所有的东西都需要synchronization. 比如, 如果共享的对象是可变的, 那是需要同步的;如果共享的对象是只读的或者是不可变的对象, 那就不需要使用同步的技术。

这个同步是由JVM来保证的.

2. synchronized方法与synchronized块

这两种方法都可以实现对java对象的同步。

先来看synchronized方法, 1) 它可以提供共享资源的互斥访问, 避免数据竞争。 2)可以防止代码被编译器进行reordering, 而造成的并发问题。 3)提供lock与unlock的方法, 在进入要同步的地方之前,要先获得lock,从而在memory中读取东西, 在释放lock的时候, 再把数据写回memory.

再来看synchronized block, 它不是对整个对象或者类进行lock,而是只针对特定的部分进行同步lock, 而对其他不需要同步的地方, 允许并发访问与执行, 这样可以加快系统的效率。

所以强烈推荐使用synchronized block

3. synchronized的粒度

下面这个例子, 实际上没有起到同步的效果。

public class Counter{
private static count = 0;

public static synchronized  getCount(){
  return this.count;
}

public synchoronized setCount(int count){
   this.count = count;
}

}


getCount是对类Coutner.class的锁定, 而setCount是对对象(this)的锁定。 所以他们可以并发的进行, 从而造成对count值的设置与读取有问题。

4. 使用synchronized的关键点

1) synchronized关键定只是用来提供在多线程环境中对java共享资源的互斥访问。 它保证了使用相同锁的多个线程的同步问题,

2) synchronized 关键定只能用在synchronized方法或者synchronized 块中,不能对变量进行synchronized操作

3) 当线程进入 synchronized时, 它必须获得相应的锁, 而当它离开时, 要释放对应的锁。 锁会在线程完成同步或者是出现错误或异常时释放。

4) 当Java Thread进行一个syncrhonized 的Java 方法时, 会要求获得对象级别的锁;而当进入Static synchronized方法时, 需要获得类级别的锁。

5) Java Synchronized关键字是可以重入的。

6) 如果java synchronized 块同步的对象是null的话, JAVA会抛出NullPointerException异常。

7) synchronized只能在同一个JVM上实现同步。 

8) 使用synchronized会造成performance的下降。

9) Java synchronized block要优于synchronized method

10) 在Java5之后, 使用violate的变量都是原子的。

11) synchronized 不能用在构造函数中, 它会造成编程的错误。

12) synchronized 不能用变量上

13) Java类库Calendar 和SimpleDataFormat不是线程安全的, 所以 需要另外的同步机制。

推荐阅读
  • 本文介绍了新款奇骏的两个让人上瘾的功能,分别是智能互联系统和BOSE音响。通过对新款奇骏的配置和功能进行评测,探讨了这两个新增功能的使用体验和优势。此外,还介绍了新款奇骏的其他配置和改进,如增加的座椅和驾驶辅助系统,以及内饰的舒适性提升。对于喜欢音响的消费者来说,BOSE音响的升级也是一个亮点。最后,文章提到了BOSE音响的数字还原能力,以及7座版无法配备BOSE音响的原因。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了华为4GLTE路由器B310的外置天线安装和设置方法。通过连接电源和网线,输入路由器的IP并登陆设置页面,选择手动设置和手动因特网设置,输入ISP提供商的用户名和密码,并设置MTU值。同时,还介绍了无线加密的设置方法。最后,将外网线连在路由器的WAN口即可使用。 ... [详细]
  • 本文讨论了前端工程化的准备工作,主要包括性能优化、安全防护和监控等方面需要注意的事项。通过系统的答案,帮助前端开发者更好地进行工程化的准备工作,提升网站的性能、安全性和监控能力。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何修改路由器密码?路由器登录密码和无线密码的修改方法
    本文介绍了修改路由器密码的两种方法:一是修改路由器登录口令,需要进入路由器后台进行操作;二是修改无线连接密码,通过进入路由器后台的无线设置和无线安全设置进行修改。详细步骤包括复位处理、登录路由器后台、选择系统工具、填入用户名和用户密码、保存修改等。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
author-avatar
Gala彬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有