认识synchronized(this)与synchronized(非this)
synchronized 代码块间的同步性在使用同步synchronized代码块时需要注意的是,当一个线程访问object 的一个
synchronized(this) 同步代码块时,其他线程对同一个object 中所有其他synchronized(this) 同步代码块的访问将被阻塞,这说明synchronized 使用的“对象监视器”是一个。
看例子:
//code 1
public class ObjectService {public void showService1() {synchronized (this) {System.out.println("这是方法1");System.out.println("线程开始睡眠,释放锁");//这里模拟一个非常耗时的业务System.out.println("线程睡眠结束");}}public void showService2() {synchronized (this) {System.out.println("这是方法2");System.out.println("线程开始睡眠,释放锁");//这里模拟一个非常耗时的业务System.out.println("线程睡眠结束");}}
}
执行结果:this是代表当前的对象,两个同步代码块指向的是同一个对象(拥有的是同一把锁),所以当一个线程进入到一个同步代码块,尽管是耗时操作,其余同步方法也是阻塞,在执行完毕后,在执行另一个方法。这种方法影响执行效率。
由于上面缺点,我们来看看非this同步代码块:
//code 2
public class ObjectService {public void showService1() {Object o = new Object();synchronized (o) {System.out.println("这是方法1");System.out.println("线程开始睡眠,释放锁");//这里模拟一个非常耗时的业务System.out.println("线程睡眠结束");}}public void showService2() {Object o = new Object();synchronized (o) {System.out.println("这是方法2");System.out.println("线程开始睡眠,释放锁");//这里模拟一个非常耗时的业务System.out.println("线程睡眠结束");}}
}
执行过程:在一个同步方法执行耗时操作的时候,另一个线程可以执行另外一个同步方法,同步代码块使用的是非this,在进入每一次方法,都会产生一个对象监视器(锁),由于方法中所有东西,在运行结束,都会消失,所以,实际在上面代码中,产生两个锁,才会出现异步的情况,大大提高运行效率。
参考:https://blog.csdn.net/venus321/article/details/79336873
有朋友提出疑问 “可是第二种synchronized根本锁不住,两个线程都可以同时访问同一个方法。加的这个锁没有任何作用,和不加一样!”
原因:
Object o = new Object();
对象内的两个方法 都生成了各自的引用变量
非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
如果两个方法上的的synchronized修饰符(注意new一次是生成了一个新的)不一致,就不能实现同步。所以code
对方法加锁的原因:
保证同一时刻只有一个线程执行这个方法。
感觉code2 不能体现加锁的意义。
认识synchronized(this)与synchronized(非this)相关推荐
- java中synchronized修饰静态方法和非静态方法有什么区别?
Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称"对象锁". Java中每个对象都有一个锁,并且是唯一的.假设分 ...
- 使用synchronized修饰静态方法和非静态方法有什么区别
前言 最近被问到了这个问题,第一次回答的也是很不好,在此参考网上答案进行整理记录.供大家学习参考. Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法 ...
- [转载] java synchronized静态同步方法与非静态同步方法,同步语句块
参考链接: Java中的静态方法与实例方法 java synchronized静态同步方法与非静态同步方法,同步语句块 并发编程 线程同步 静态方法锁 非静态方法锁 同步块 进行多线程编程,同步控制是 ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
大纲:java线程知识体系 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点.同步块不仅可以更加精确的控制对象锁,还可以控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁 ...
- 四、java多线程核心技术——synchronized同步方法与synchronized同步快
一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变 ...
- synchronized(class)、synchronized(this)与synchronized(object)的区别分析
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.假如再细的分类,synchronized可作用于instance变量.objec ...
- synchronized方法与synchronized代码块的区别
2019独角兽企业重金招聘Python工程师标准>>> synchronized methods(){} 与synchronized(this){}之间没有什么区别,只是 synch ...
- synchronized(this)、synchronized(class)与synchronized(Object)的区别
在多线程开发中,我们经常看到synchronized(this).synchronized(*.class)与synchronized(任意对象)这几种类型同步方法.但是是否知道这几种写法有什么区别了 ...
- java 静态方法枷锁_Java synchronized静态方法使用synchronized加锁
昆明达内Java培训的老师上一期讲了Java synchronized实例方法使用synchronized加锁,这一期给同学们讲Java synchronized静态方法使用synchronized加 ...
- java synchronized关键字_Java synchronized 关键字,你用的对吗?
for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread.getName + " " + i) ...
最新文章
- EK算法网络流模板hdu1532
- springboot配置cxf
- centos7 php 404,CentOS7 Apache环境配置自定义404错误页面怎么解决
- 橙子云手机华为保修吗_华为云手机引关注!将替代传统手机?华为回应来了
- java lwjgl3_java-LWJGL 3鼠标移动
- Knockout中ViewModel与Model的互转
- html怎么把一段文字设置为连接到下一个网页的按钮,网页设计三合一模拟试题(一)...
- mysql —— 分表分区
- 两台电脑共享怎么设置_两台电脑共用键鼠的简单设置
- python中从键盘输入列表_在python中为列表使用原始输入
- 软件安装下载的镜像站、国内源
- 关于HTML中onSubmit属性的触发时机
- 怎么隐藏php版本,Linux服务器中怎样隐藏PHP版本
- 经纬创投:我们研究了200多家公司的融资条款,告诉你如何防止被“套路”
- 74款android开机动画,修改Android系统开机动画
- [乐意黎原创]联想G470老笔记本升级改造
- 登陆注册页面html代码(仿知乎)
- 完成基因序列(fasta格式)的提取,核苷酸计数,GC含量计算,DNA 翻译为 RNA,RNA 翻译为 蛋白质,反向序列获取的相关函数
- Django 框架图
- Pycharm下载与安装教程