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同步方法详解
# 类中
# 可以通过
# 可以使用
# 在上面
# 都是
# 就会
# 还可以
# 其他的
# 这两个
# 时间内
# 用了
# 希望能
# 就不能
# 只有一个
# 只需要
# 有两种
# 谢谢大家
# 在上
# 可以得到
# 所持
相关文章:
如何高效利用200m空间完成建站?
建站之星后台密码遗忘如何找回?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
网站制作服务平台,有什么网站可以发布本地服务信息?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
如何在阿里云ECS服务器部署织梦CMS网站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
如何通过虚拟机搭建网站?详细步骤解析
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
如何在IIS中新建站点并配置端口与物理路径?
如何在Windows服务器上快速搭建网站?
如何通过云梦建站系统实现SEO快速优化?
如何通过NAT技术实现内网高效建站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
如何选择高效稳定的ISP建站解决方案?
如何选择CMS系统实现快速建站与SEO优化?
如何通过宝塔面板实现本地网站访问?
如何挑选优质建站一级代理提升网站排名?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
已有域名如何快速搭建专属网站?
制作农业网站的软件,比较好的农业网站推荐一下?
如何选购建站域名与空间?自助平台全解析
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
建站之星×万网:智能建站系统+自助建站平台一键生成
网站制作的步骤包括,正确网址格式怎么写?
如何高效完成独享虚拟主机建站?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
建站之星安装步骤有哪些常见问题?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
网站制作公司排行榜,抖音怎样做个人官方网站
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
小建面朝正北,A点实际方位是否存在偏差?
如何注册花生壳免费域名并搭建个人网站?
如何在IIS中新建站点并解决端口绑定冲突?
如何快速生成橙子建站落地页链接?
,巨量百应是干嘛的?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
如何在服务器上三步完成建站并提升流量?
如何选择香港主机高效搭建外贸独立站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何快速打造个性化非模板自助建站?
如何快速生成ASP一键建站模板并优化安全性?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
视频网站制作教程,怎么样制作优酷网的小视频?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
微信推文制作网站有哪些,怎么做微信推文,急?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
*请认真填写需求信息,我们会在24小时内与您取得联系。