synchronized关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、
D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

主要有两种用法:synchronized方法和synchronized代码块

对于synchronized方法,有如下作用:

public synchronized void syncCounter(int newVal){
System.out.println("synchronized方法...");
}

确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个synchronized方法处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为
synchronized)。

synchronized 方法也有它的缺陷:
若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法
run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized
方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized
,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。

对于synchronized代码块:

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

int i=100,userId=2;
String userName="SyncMM";
public void methodName(){
synchronized(this){
i++;
System.out.println("Synchronized param i:"+i); }
System.out.println("userName:"+userName);
}

未完待续!

最新文章

  1. centos7安装jdk8
  2. WPF 触发器
  3. leetcode-Single Number III 找独数
  4. rbegin 和 end 区别
  5. EL表达式与JSTL(C)标签
  6. MyEclipse的一些配置
  7. php面试常用算法
  8. PHP框架学习之Laravel基本功能
  9. 在Linux环境下搭建Tomcat+mysql+jdk环境
  10. 深度学习入门篇--手把手教你用 TensorFlow 训练模型
  11. docker中的镜像中运行Django项目
  12. PAT 1132 Cut Integer
  13. JVM学习一:JVM运行时数据区
  14. 斗地主 ai的一些资料
  15. NuGet 构建服务器与常用命令
  16. mssql sqlserver 关键字 GROUPING用法简介及说明
  17. session和cookie相关知识总结
  18. java比较两个对象是否相等?
  19. C# 计算接口调用时长
  20. maven - 使用nexus 搭建maven私服

热门文章

  1. ASP.NET MVC ViewData/ViewBag 简单小结
  2. oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
  3. Java为什么只能单继承?
  4. React Native开发环境搭建
  5. 实现多个UIView之间切换的动画效果
  6. noip2015day1 T1 4510 神奇的幻方
  7. MVC中的 程序集添加-----程序包管理器控制台
  8. WinFrom“动态”WebService
  9. What Makes a Good Programmer Good?
  10. C#高效率导出Excel