锁的范围越小,对代码执行效率的影响最小。最好的方式就是不加锁,并发编程不一定都是非线程安全的,只有多线程共享同一实例变量才有可能会出现线程安全问题。非线程安全问题才需要加锁进行同步。

1、synchronized 方法

解决了线程安全的问题,但影响执行效率;synchronized 方法 锁的范围是最大的,所以执行效率也是最慢的。

synchronized public void printA() {try {System.out.println("线程名称为:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"进入printA");Thread.sleep(3000);System.out.println("线程名称为:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"离开printA");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

2、synchronized static 方法

每一个 *.java 文件对应class类的实例在内存中是单例的。synchronized static 方法 是对 *.java 文件对应的Class类对象进行持锁;synchronized 方法 是将方法所在类的实例对象为锁,俩者是俩把不同的锁。

synchronized static void printC() {try {System.out.println("线程名称为:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"进入printC");System.out.println("线程名称为:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"离开printC");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}

3、synchronized(xxx.class)代码块

synchronized(xxx.class)代码块可以对类的所有对象实例起作用。

public void printC() {synchronized (Service1.class) {System.out.println("线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "进入printC");System.out.println("线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "离开printC");}}

4、synchronized(this)代码块:

锁定的是当前对象,对比 synchronized 方法,减少了锁的范围,也就是减少了同步代码的范围,从而提高了程序执行效率。

 public void println(String x) {synchronized (this) {print(x);newLine();}}

5、synchronized (非this对象)代码块

优点是存在俩把锁,不与其他 synchronized(this)争抢 this 锁,减少同步的范围,大大提高运行效率。

package com.yu.syn;public class Service2 {private String usernameParam;private String passwordParam;private String anything = new String();public void setUsernamePassword(String username, String password) {String anything = new String();try {synchronized (anything) {System.out.println("线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "进入同步快");usernameParam = username;Thread.sleep(3000);passwordParam = password;System.out.println("线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "离开同步快");}} catch (InterruptedException e) {e.printStackTrace();}}}

拨开云雾synchronized使用五种方式介绍相关推荐

  1. java中读取properties文件内容五种方式

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  2. Android数据存储五种方式总结

    1 使用SharedPreferences存储数据     2 文件存储数据       3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解 ...

  3. android mysql储存动态数据_Android数据存储五种方式总结

    本文介绍Android平台进行数据存储的五大方式,分别如下: 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据 适用范围:保存少量的数据,且这些数据的格式非常简单 ...

  4. java clone方法_干货满满:Java中创建对象的五种方式详解

    通常来说,对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为. 作为Java开发者,我们通常都是使用依赖管理系统,比如Spring去创建Java对象,但使用管理系统创建对象并不是唯一 ...

  5. Github项目解析(九)--实现Activity跳转动画的五种方式

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...

  6. php随机数字不重复使等式成立_php随机数不重复生成的五种方式

    在前一篇文章中我介绍了php随机数的生成方法,我们都知道php随机数不管是在开发中,还是在移动应用中,都是不可少的一部分,平时日常开发中经常会跟php随机数打交道,那么今天就给大家介绍php随机数不重 ...

  7. Android_安卓为按钮控件绑定事件的五种方式

    写在最前面 本次,来介绍一下安卓中为控件--Button绑定事件的五种方式. 二.具体的实现 第一种:直接绑定在Button控件上: 步骤1.在Button控件上设置android:onClick=& ...

  8. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...

  9. 五种方式让你在java中读取properties文件内容不再是难题

    2019独角兽企业重金招聘Python工程师标准>>> 方式1.通过context:property-placeholder加载配置文件jdbc.properties中的内容 < ...

最新文章

  1. idea svn的项目无法标识修改新增的类_是时候让你的 IDEA 飞起来啦!
  2. 力扣(LeetCode)刷题,简单题(第6期)
  3. 基于区块链的健康链系统设计与实现(2)区块链平台Web服务器
  4. Android中设置RecyclerView的每一个item的单项点击事件
  5. VSCode 初次写vue项目并一键生成.vue模版
  6. Codeforces #471
  7. 西南交通大学计算机网络,西南交通大学计算机网络实验2015-2016第2学期期末试卷...
  8. windows 2008 R2操作系统上使用iis服务运行php和mysql数据库的网站遇到的验证码不显示问题?...
  9. redis命令_Redis 命令执行过程(上)
  10. 在dll中用DirectSound8同时播放多个wav文件不能发声
  11. winhex数据恢复linux,winhex数据恢复教程(非常巨大,内容丰富)
  12. KEIL编译时Warning: C3008W: splitting LDM/STM has no benefit的消除
  13. 河海大学计算机辅助,黄瑞
  14. 安全技术和防火墙——iptables防火墙
  15. PowerApps教程09-下拉列表以及联动筛选
  16. AUTOSAR - WDGM认知过程(二):配置分析
  17. Web3中文|火遍全网的去中心化推特「Damus」是什么?(附操作指南)
  18. 开源项目哪家强?Github年终各大排行榜超级盘点
  19. mac(苹果电脑系统)安装vs code编译运行c/c++
  20. git常见的命令大全

热门文章

  1. 微信小程序第六节:WXML语法学习
  2. 【Linux】嵌入式·NAND Flash
  3. 【陈工笔记】# LaTeX 中,图片如何不置顶? #
  4. Oracle 数据库一键安装,从未如此简单
  5. 如何进行远程控制电脑
  6. Spark报错:Error:scalac: Scala compiler JARs not found (module ‘Spark_two‘): C:\Users\沫小新\.m2\repo
  7. 骁龙芯片性能排行2020_骁龙765G跌出前10!手机芯片性能排名
  8. I/O无线控制器(综科)-4G通讯直接上云平台(阿里云)
  9. 【阿里云高校计划】导论-视觉AI技术应用探索 day1 【一见钟情】
  10. uniapp项目实现扫描二维码和NFC识别功能