并发编程——synchronized关键字的使用

前言

咱们通常对共享数据操做的时候,为了达到线程安全咱们会使用synchronized关键字去修饰方法或者代码块。那么今天咱们就来说一讲synchronized关键字的使用。编程

专栏推荐:
并发编程专栏安全

synchronized的使用

synchronized的使用能够修饰代码块,也能够修饰对象方法,以及静态方法。不过这些修饰的本质实质就只是锁的资源不一样,一种是对象,一种是类。多线程

修饰代码块

错误代码:this,对象锁

并发

当咱们使用不一样实例对象去调用方法的时候会发现结果并非咱们想象的20000,由于this这个指代的是当前对象,由于是两个不一样的对象,因此使用this是锁不住的。
看一下执行结果:
this

只有使用相同的对象的时候,才能够。因此不推荐使用this,而是使用固定的对象去做为锁,才可以锁住。
线程

相同实例对象的执行结果:
3d

下面咱们使用一个初始化好的一个实例对象做为对象锁。(useSynchronized)对象

使用不一样的对象去调用也没有问题,由于对象锁是初始化好的一个实例对象useSynchronized做为对象锁
blog

执行结果正确:
图片

修饰对象方法

[图片上传中...(对象方法main.png-d41e8a-1628781214368-0)]

修饰对象方法,这个就和代码块中使用对象锁同样,由于synchronized修饰在对象方法上,因此它实质是等于代码块中使用this,由于一个类能够有不少实例对象,因此这个是锁不住的。

执行结果有问题,未能锁住:

修饰静态方法

修饰静态方法,这个就和代码块中使用类锁同样,由于synchronized修饰在静态方法上,因此它实质是等于代码块中使用当前这个类的class,无论你一个类有多少个实例对象,你只有一个class,类锁是惟一的就不会出现多线程同时执行方法的现象。

执行结果,和咱们预想的同样20000:

总结一下:

一、synchronized修饰对象方法,若是是不一样的对象调用这个方法,是不能启动任何控制做用的。synchronized修饰代码块时,若是锁资源使用的是this,那么就和synchronized修饰对象方法同样,由于一个类能够有多个实例对象,每一个实例对象都不同,就至关于一个门,有多个钥匙,谁均可以进入。因此咱们使用synchronized修饰代码块时,咱们须要声明一个惟一的钥匙,好比咱们上面的代码,先建立一个静态的实例对象,使用它看成这个门的惟一钥匙,就能够保证多个线程,不会同时进入方法内执行。

二、synchronized修饰静态方法,就比较简单了,咱们直接使用某一个类的class,它就能够实现一个惟一性,无论是这个类的多少个实例对象,这些对象对应的class只有一个。因此是能够实现多线程操做共享资源,不会有问题。那么当咱们synchronized修饰代码块时,使用的是类锁的话,那就很简单了,惟一的类锁,和修饰静态方法同样。

感谢诸君的观看,文中若有纰漏,欢迎在评论区来交流。若是这篇文章帮助到了你,欢迎点赞👍关注。

相关文章
相关标签/搜索