Java中使用synchronized关键字实现简单同步操作示例

 更新时间:2015年04月07日 12:02:32   投稿:junjie  
这篇文章主要介绍了Java中使用synchronized关键字实现简单同步操作示例,本文起讲解了synchronized修饰函数、synchronized修饰代码块、synchronized修饰静态方法等内容,需要的朋友可以参考下

简单记录下java中synchronized关键字的使用方法。

在介绍之前需要明确下java中的每一个类的对象实例都有且只有一个锁(lock)和之相关联,synchronized关键字只作用于该锁,即可以认为synchronized只对java类的对象实例起作用。

synchronized修饰函数

复制代码 代码如下:

public synchronized aMethod(){
}

这就是最常用的情景,那么这个同步方法的用途是啥,为了方便就记作aMethod方法。

1、synchronized锁定的是调用这个同步方法的对象实例,举个例子,同一个实例P1在不同线程中都调用aMethod时会产生同步;
2、需要注意的是这个对象所属的类的另一对象P2却能够任意调用这个aMethod,因为不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的aMethod方法;
3、如果一个对象有多个synchronized方法,比如aMethod、bMethod、cMethod,现在只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法。

上述代码其实等价于下面:

复制代码 代码如下:

public void aMethod() {  
    synchronized (this) {
    }  
}

这里的this就是指的该实例对象的引用,如P1。可见同步方法实质是将synchronized作用于object reference。那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱。由此我们引出了下面的同步块。

synchronized修饰代码块

复制代码 代码如下:

public void dMethod(SomeObject so) {  
    synchronized(so) {
    }  
}

在这里synchronized获得锁就是so这个对象的锁,因而谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
复制代码 代码如下:

class Foo implements Runnable {
    private byte[] lock = new byte[0];
    Public void method() {
        synchronized(lock) {
        }
    }
}

零长度的byte数组对象创建起来将比任何对象都经济高效。

synchronized修饰静态方法

前面提到了synchronized关键字只对不同线程中的P1实例有效,那如何可以同时对P1和P2不同实例有效呢,答案就是使用synchronized修饰静态方法,类的静态方法可以说是这个类自有的,并不依赖类的实例,所以我们只要对类的静态方法使用synchronized关键字来修饰就可以达到不同实例间的同步了。

相关文章

  • SpringBoot集成tomcat详解实现过程

    SpringBoot集成tomcat详解实现过程

    采用spring boot之后,一切变得如此简单,打包->java-jar->运维,只需要一个jar包便可以随意部署安装。这篇文章,将对 spring boot集成tomcat的源码进行分析,探索其内部的原理
    2023-02-02
  • spring与mybatis三种整合方法

    spring与mybatis三种整合方法

    这篇文章主要介绍了spring与mybatis三种整合方法,需要的朋友可以参考下
    2017-04-04
  • 深入理解Java中Filter的作用种类及应用场景

    深入理解Java中Filter的作用种类及应用场景

    Filter(过滤器)是Java Web中的一种重要组件,可以对请求和响应进行拦截处理,对数据进行过滤和处理。Filter可以实现许多功能,如:鉴权、日志记录、字符编码转换、数据压缩、请求重定向等等
    2023-04-04
  • MapStruct对象映射转换解决Bean属性拷贝性能问题

    MapStruct对象映射转换解决Bean属性拷贝性能问题

    无意间看到项目中有小伙伴用到了 MapStruct 来做对象映射转换当时我就很好奇,这个是什么框架,能够解决什么问题,带着这两个疑问就有了下面的文章
    2022-02-02
  • java计算工作时间除去节假日以及双休日

    java计算工作时间除去节假日以及双休日

    这篇文章主要为大家详细介绍了java计算工作时间除去节假日以及双休日的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • SpringBoot整合Redisson实现分布式锁

    SpringBoot整合Redisson实现分布式锁

    本文主要介绍了SpringBoot整合Redisson实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 关于SpringBoot使用@ExceptionHandler注解局部异常处理

    关于SpringBoot使用@ExceptionHandler注解局部异常处理

    这篇文章主要介绍了关于SpringBoot使用@ExceptionHandler注解局部异常处理,SpringBoot提供了多种方式来处理异常,在本文中,我们将介绍SpringBoot中的@ExceptionHandler注解,演示如何使用它进行局部异常处理
    2023-07-07
  • Activiti流程图查看实例

    Activiti流程图查看实例

    这篇文章主要介绍了Activiti流程图查看实例,需要的朋友可以参考下
    2014-08-08
  • 关于SpringSecurity简介以及和Shiro的区别

    关于SpringSecurity简介以及和Shiro的区别

    这篇文章主要介绍了关于SpringSecurity简介以及和Shiro的区别,在Java应用安全领域,Spring Security会成为被首先推崇的解决方案,就像我们看到服务器就会联想到Linux一样顺理成章,需要的朋友可以参考下
    2023-07-07
  • Spring Cloud Eureka 注册与发现操作步骤详解

    Spring Cloud Eureka 注册与发现操作步骤详解

    这篇文章主要介绍了Spring Cloud Eureka 注册与发现操作步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论