synchronized关键字使用剖析
2024-10-18 04:59:54
synchronized关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、
D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
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 块。
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);
}
未完待续!
最新文章
- centos7安装jdk8
- WPF 触发器
- leetcode-Single Number III 找独数
- rbegin 和 end 区别
- EL表达式与JSTL(C)标签
- MyEclipse的一些配置
- php面试常用算法
- PHP框架学习之Laravel基本功能
- 在Linux环境下搭建Tomcat+mysql+jdk环境
- 深度学习入门篇--手把手教你用 TensorFlow 训练模型
- docker中的镜像中运行Django项目
- PAT 1132 Cut Integer
- JVM学习一:JVM运行时数据区
- 斗地主 ai的一些资料
- NuGet 构建服务器与常用命令
- mssql sqlserver 关键字 GROUPING用法简介及说明
- session和cookie相关知识总结
- java比较两个对象是否相等?
- C# 计算接口调用时长
- maven - 使用nexus 搭建maven私服
热门文章
- ASP.NET MVC ViewData/ViewBag 简单小结
- oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
- Java为什么只能单继承?
- React Native开发环境搭建
- 实现多个UIView之间切换的动画效果
- noip2015day1 T1 4510 神奇的幻方
- MVC中的 程序集添加-----程序包管理器控制台
- WinFrom“动态”WebService
- What Makes a Good Programmer Good?
- C#高效率导出Excel