java synchronized 详解

synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对象变量,你也可以通synchronizedl来同步类中的静态方法和非静态方法。
synchronized块的语法如下:
public void method()
{
synchronized(表达式)
{
}
}
public void method()
{
synchronized(表达式)
{
}
}
第一种:非静态方法的同步
从Java相关语法可以知道使用synchronized关键字来定义方法就会锁定类中所用使用synchroniezd关键字定义的静态方法和非静态方法,但是这有点不好理解,如果要synchronized块,来达到这样的效果,就不难理解为什么会产生这种效果了,如果使用synchronized来锁定类中所有的同步非静态方法,只需要使用this作为synchronized块的参数传入synchronized块中,代码如下:
通过synchronized块来同步非静态方法
在上面的代码中的method1使用了synchronized块,method2方法是用了synchronized关键字来定义方法,如果使用同一个Test实例时,这两个方法只要有一个在执行,其他的方法都会因未获得同步锁而被堵塞。除了使用this作为synchronized块的参数,也可以使用Test.this作为synchronized块的参数来达到同样的效果。
public class Test
{
public void method1()
{
synchronized(this)
{
}
}
public synchronized void method2()
{
}
}
public class Test
{
public void method1()
{
synchronized(this)
{
}
}
public synchronized void method2()
{
}
}
在内类中使用synchronized块中,this只表示内类,和外类(OuterClass)没有关系。但是内类中的非静态方法和外类的非静态方法也可以同步。如果在内类中加个方法method3也可以使和Test里面的2个方法同步,代码如下:
public class Test
{
class InnerClass
{
public void method3()
{
synchronized(Test.this){
}
}
}
}
public class Test
{
class InnerClass
{
public void method3()
{
synchronized(Test.this){
}
}
}
}
上面InnerClass的method3方法与Test的method1和method2方法在同一时间内只能有一个方法执行。
synchronized块不管是正确执行完,还是因为程序出错因异常退出synchronized块,当前的synchronized块所持有的同步锁都会自动释放,因此在使用synchronized块不必担心同步锁的问题。
二、静态方法的同步
由于在调用静态方法时,对象实例不一定被创建,因此,就不能使用this来同步静态方法,而必须使用Class对象来同步静态方法。代码如下:
public class Test{
pubic static void method1(){
synchronized(Test.class){
}
}
public static synchronized void method2(){
}
}
public class Test{
pubic static void method1(){
synchronized(Test.class){
}
}
public static synchronized void method2(){
}
}
在同步静态方法时可以使用类的静态字段class来得到class对象,在上例中method1和method2方法只有一个方法执行,除了使用class字段可以得到class对象,还可以通过实例的getClass()方法获取class对象,代码如下:
public class Test{
public static Test test;
public Test(){
test=this;
}
public static void method1(){
synchronized(test.getClass()){
}
}
}
public class Test{
public static Test test;
public Test(){
test=this;
}
public static void method1(){
synchronized(test.getClass()){
}
}
}
在上面的代码中,我们通过一个public的静态对象得到Test的一个实例,并通过这个实例的getClass方法获取一个class对象(注意一个类的所有实例通过getClass方法得到的都是同一个Class对象)。我们也可以通过class使不同类的静态方法同步,代码如下:
Test类中的方法和Test1类中方法同步。
public class Test1{
public static void method1(){
synchronized(Test.class){
}
}
}
public class Test1{
public static void method1(){
synchronized(Test.class){
}
}
}
注意:在使用synchronized块来同步方法时,非静态方法可以通过this来同步,而静态方法必须使用class对象来同步,但是非静态方法也可以通过使用class来同步静态方法。但是静态方法中不能使用this来同步非静态方法。这点在使用synchronized块需要注意。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# synchronized
# 详解
# 实例详解
# Java多线程synchronized同步方法详解
# java中synchronized(同步代码块和同步方法)详解及区别
# Java使用synchronized修饰方法来同步线程的实例演示
# Java中synchronized关键字修饰方法同步的用法详解
# Java synchronized同步方法详解
# 类中
# 可以通过
# 可以使用
# 在上面
# 都是
# 就会
# 还可以
# 其他的
# 这两个
# 时间内
# 用了
# 希望能
# 就不能
# 只有一个
# 只需要
# 有两种
# 谢谢大家
# 在上
# 可以得到
# 所持
相关文章:
c# await 一个已经完成的Task会发生什么
自助网站制作软件,个人如何自助建网站?
黑客如何利用漏洞与弱口令入侵网站服务器?
c++ stringstream用法详解_c++字符串与数字转换利器
制作网站的公司有哪些,做一个公司网站要多少钱?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
焦点电影公司作品,电影焦点结局是什么?
如何在云主机上快速搭建网站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
北京建设网站制作公司,北京古代建筑博物馆预约官网?
南平网站制作公司,2025年南平市事业单位报名时间?
长沙做网站要多少钱,长沙国安网络怎么样?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
建站主机选购指南与交易推荐:核心配置解析
如何零基础在云服务器搭建WordPress站点?
如何制作一个表白网站视频,关于勇敢表白的小标题?
建站之星后台密码遗忘或太弱?如何重置与强化?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
建站之星好吗?新手能否轻松上手建站?
如何通过FTP服务器快速搭建网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
如何快速完成中国万网建站详细流程?
制作企业网站建设方案,怎样建设一个公司网站?
寿县云建站:智能SEO优化与多行业模板快速上线指南
建站主机解析:虚拟主机配置与服务器选择指南
表情包在线制作网站免费,表情包怎么弄?
建站之星收费标准详解:套餐费用及年费价格表一览
建站之星备案流程有哪些注意事项?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何注册花生壳免费域名并搭建个人网站?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
C++如何编写函数模板?(泛型编程入门)
代刷网站制作软件,别人代刷火车票靠谱吗?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
网站图片在线制作软件,怎么在图片上做链接?
制作网站的软件免费下载,免费制作app哪个平台好?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
建站主机SSH密钥生成步骤及常见问题解答?
实现虚拟支付需哪些建站技术支撑?
简单实现Android验证码
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
*请认真填写需求信息,我们会在24小时内与您取得联系。