Java线程同步:synchronized锁住的是代码还是对象

转载 2016年05月30日 14:04:10

记录

synchronized锁住的是代码还是对象。答案是:synchronized锁住的是括号里的对象,而不是代码。对于非static的synchronized方法,锁的就是对象本身也就是this。

当synchronized锁住一个对象后,别的线程如果也想拿到这个对象的锁,就必须等待这个线程执行完成释放锁,才能再次给对象加锁,这样才达到线程同步的目的。即使两个不同的代码段,都要锁同一个对象,那么这两个代码段也不能在多线程环境下同时运行。

所以我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步。这叫减小锁的粒度,使代码更大程度的并发。原因是基于以上的思想,锁的代码段太长了,别的线程是不是要等很久,等的花儿都谢了。

总结:
1. synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
2. synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
对synchronized(this)的一些理解
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

深入理解synchronized(synchronized锁住的是代码还是对象)

面试安卓难免会问到许多的java问题,毕竟安卓目前就是用java编写的,虽然一些小众语言很强势,比如kotlin,AndroidStudio的一个插件,可以用来开发安卓程序,kotlin有许多特性是j...
  • shenshibaoma
  • shenshibaoma
  • 2016年11月02日 16:52
  • 6994

java中synchronized锁定对象问题

java中synchronized锁定对象问题关于synchronized关键字介绍的博客有很多,也很详细,但是还是有很多问题让我很迷惑,比如synchronized锁定对象到底该怎么设置的问题,通过...
  • u010149189
  • u010149189
  • 2016年03月14日 22:08
  • 2101

Java线程同步:synchronized锁住的是代码还是对象

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。Synchronized既可以对代码块使用,也可以加在整...
  • findsafety
  • findsafety
  • 2014年01月08日 09:53
  • 6358

Java线程同步,synchronized锁住的是代码还是对象

作者:叉叉哥   转载自:http://blog.csdn.net/xiao__gui/article/details/8188833  在Java中,synchronized关键字是用来控制线程同...
  • u013457276
  • u013457276
  • 2016年10月24日 11:01
  • 139

synchronized锁住的是代码还是对象

java synchronized详解记下来,很重要。Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象...
  • qq_26566331
  • qq_26566331
  • 2016年09月27日 11:28
  • 1179

synchronized锁住了什么

先看一个简单示例,下面这段代码能够正常通过编译。 public class SyncTest {     public SyncTest syncVar;    ...
  • yanlinwang
  • yanlinwang
  • 2015年03月17日 11:12
  • 10082

java synchronized到底锁住的是什么

刚学java的时候,只知道synchronized一个线程锁,能够锁住代码,但是它真的能像我想的那样,能够锁住代码吗? 在讨论之前先看一下项目中常见关于synchronized的用法: publ...
  • zl544434558
  • zl544434558
  • 2016年04月19日 13:48
  • 2373

JAVA Synchronized 关键字锁实例和锁CLASS对象的区别

转自:http://liuinsect.iteye.com/blog/1662839
  • suyu_yuan
  • suyu_yuan
  • 2017年01月13日 15:13
  • 982

Java线程同步中关键字synchronized简述

Java线程同步中关键字synchronized简述 一、作用: synchronized关键字通过修饰一个方法或者声明一个代码块,从而产生一个同步对象锁以及对应的同步代码块。每当...
  • beiyus
  • beiyus
  • 2015年10月14日 13:40
  • 1757

关于synchronized,对象锁的理解

要想很好的理解synchronized 必须理解好什么是对象锁。 关于对象锁的理解:    刚开始真的有点难理解这个对象锁的概念,在网上搜了一大堆,感觉还是不怎么清晰。今天在次理解了下对象锁,...
  • dac55300424
  • dac55300424
  • 2013年07月19日 11:02
  • 1222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java线程同步:synchronized锁住的是代码还是对象
举报原因:
原因补充:

(最多只允许输入30个字)