每个对象都有一把独占锁。

独占锁仅仅限制线程对它的同步方法的訪问,对非同步方法,独占锁没有意义。

synchronizedkeyword能够作为函数的修饰符,也能够作为函数内的语句,也就是平时说的同步方法和同步代码块。假设再细分的话。synchronized能够作用域instance变量、对象引用、static函数和类上。

只是不管synchronizedkeyword载入方法上还是对象上。它取得的锁都是对象锁。

而不是把一段代码或者函数当做锁。所以说,虽然我们对方法进行了同步,该同步方法还是有可能被其它线程的对象訪问的。

作用域

1、在某个对象实例内

比方代码块儿、方法上的同步,能够防止多个线程同一时候訪问这个对象(注意:是这一个对象。

该类的其它对象的同步方法相应另外一个对象锁)的同步方法。

这时,不同对象实例的同步方法,是不互相干扰的。也就是说,其它线程依旧能够訪问同样类的还有一个对象的同步方法。

假设一个对象里能够有随意多个同步方法。随意时间里仅仅能有一个线程訪问这个对象的这些同步方法。

比如,现成T1在訪问同步方法Method1,此时另一个同步方法Method2此时无人訪问,可是因为已经有一个线程正在訪问这个对象的同步方法Method1。所以试图訪问Method2的线程将被堵塞。直到T1对M1的訪问结束。

可见同步方法有在一个同步方法执行期内保证仅仅有一个线程能够进入。

一旦方法结束。里面的线程就会失去对该对象的独占权。 synchronized语句块,能够指定要获得哪个对象的独占权。一旦获得。在语块执行过程中。线程会始终掌握该对象的独占权。此时,它能够连续訪问多个该对象的同步方法。在整个过程中。独占权都牢牢掌握在该线程手中,其他线程没有不论什么机会。

而假设没有同步语句块,则假设连续訪问某个对象的同步方法,则在前一个方法返回。到下一个方法调用的间隙内,其他线程有机会抢先获得该对象的独占权。

PS:synchronized关键能够修饰函数、函数内语句。

不管它加上方法还是对象上,它取得的锁都是对象,而不是把一段代码或是函数当作锁。

2、某个类的范围

比方在静态方法上加上同步keyword。因为静态方法是类级别的,所以它能够多累的全部对象实例都起作用。

synchronized方法控制对类成员变量的訪问:每一个类实例一把锁。每一个同步方法都必须获得调用该方法的类实例的锁。才干运行。否则该线程会进入堵塞状态。一旦运行,就独占该锁,知道其释放锁为止。

这样的机制确保了同一时刻相应一个类实例,有效避免类成员变量訪问冲突的问题。属于以牺牲效率确保安全的策略。

PS:Java中,不仅类的每个对象都队赢一把独占锁。每个类也相应了一把锁。我们能够将类的静态成员声明为synchronized,来控制器类的静态成员变量的訪问。

总结一下:

通过上面的论述。我们能够得出:synchronizedkeyword的同步方法。本质上是 作用于对象的引用。

哪一个线程拿了对象锁A,就能够调用该对象的同步方法。而对象锁B。与A锁毫不相干。程序能够通过对象锁B随意訪问同步方法。

3、同步代码块

同步代码块也值得一提。代码块中的同步,表示对这个区块的资源实行呼哧訪问,它的作用域也是当前对象。

这时锁就是对象,谁拿到了这个锁,就能够执行它锁控制的那段代码。

PS:synchronizedkeyword是不能继承的,集成类须要你显示指定它的某个方法为同步方法。

轻松学会多线程(四)——synchronized同步keyword知多少的更多相关文章

  1. java 多线程 3 synchronized 同步

    多任务编程的难点在于多任务共享资源.对于同一个进程空间中的多个线程来说,它们都共享堆中的对象.某个线程对对象的操作,将影响到其它的线程. 在多线程编程中,要尽力避免竞争条件(racing condit ...

  2. java 多线程并发 synchronized 同步机制及方式

    2. 锁机制 3. 并发 Excutor框架 4. 并发性与多线程介绍 1. synchronized  参考1. synchronized 分两种方式进行线程的同步:同步块.同步方法 1. 方法同步 ...

  3. java多线程(四)之同步机制

    1.同步的前提 多个线程 多个线程使用的是同一个锁 2.同步的好处 同步的出现解决了多线程的安全问题 3.同步的弊端 当线程较多时, 因为每个线程都会去判断同步上的锁, 这样是很耗费资源的, 会降低程 ...

  4. 四、java多线程核心技术——synchronized同步方法与synchronized同步快

    一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变 ...

  5. java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决

    0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...

  6. Java多线程synchronized同步

    非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程 ...

  7. java多线程(三)——锁机制synchronized(同步语句块)

    用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解 ...

  8. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  9. java中的synchronized同步代码块和同步方法的区别

    下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...

随机推荐

  1. Orleans-Hello World

    Orleans-Hello World http://www.rm5u.com/orleans/orleans-intro.html 什么是Orleans?          Orleans(奥尔良) ...

  2. C语言中给数组赋随机值

    srand和rand两个函数配合可以产生伪随机数序列.rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数.如果系统提供的种子没有变化,每次调用r ...

  3. QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)

    QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以 ...

  4. cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞

    上篇文章实现了坦克与地图碰撞的检测, 这篇我们继续完成子弹和地图的碰撞检测. 1.先设计一个子弹类Bullet,如下所示: class Bullet : public CCSprite { publi ...

  5. mpi中利用自定义归约操作实现merge

    在归并排序中,很重要的一步是将两个排序数组合并成一个数组,这个操作叫merge.merge操作可以用来解决某些Top K问题. 问题描述 在哼唱搜索中,用户通过哼唱一个音乐片段去搜索与其相似的音乐.后 ...

  6. poj 1182食物链(并查集)

    算法思路:把那些确定了相对关系的节点放在同一棵树里(可以同时存在多棵树,单独每棵树中节点的相对关系确定),每个节点对应的 v[] 值记录他与根节点的关系( 0:同类: 1:根吃他: 2:他吃根 ).当 ...

  7. ClassLoader载入指定的类需注意六个细节或报ClassNotFundEception异常总结

    项目中,载入指定的类反射调用方法一直报类找不到,经过数百次的測试.对这样的问题有了一个又一次的认识,特总结.记录.分享例如以下: 1.路径中尽可能用"/"或者File.separa ...

  8. transition与animation

    以前,一直都知道,transition是animation的一个简化版,甚至不算是动画,而是一种过渡. transition的用法 早两天用transition写了一个按钮滑动的效果,类似于IOS的设 ...

  9. C语言指针和数组知识总结(下)

    一.数组指针: 数组指针就是一个指针,只不过它指向的是一个数组.可以通过如下方式来定义 typedef int Array[5]; //数组类型 Array* m;      //数组定义 还有一种更 ...

  10. Codeforces Round #199 (Div. 2) C. Cupboard and Balloons

    C. Cupboard and Balloons time limit per test 2 seconds memory limit per test 256 megabytes input sta ...