`
yanlijun250
  • 浏览: 757536 次
文章分类
社区版块
存档分类
最新评论

synchronized 方法

 
阅读更多

因为之前对syncronized方法的错误理解,最近犯了一个很严重的错误,以此文记。

错误理解synchronized方法仅对此同步方法加锁,只是这个方法不能被多个线程同步执行

正确理解:synchronized方法对整个实例内所有synchronized 方法加锁,一个实例内所有的synchronized方法不能被同步执行。

----------

参考:1、笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?


----------------------------------------------------------------------------

synchronized方法:通过在方法声明中加入synchronized关键字来声明synchronized方法。如:

publicsynchronizedvoidaccessVal(intnewVal);
synchronized方法控制对类成员变量的访问:每个类实例对应一把锁,每个synchronized方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为synchronized的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为synchronized)。
  在Java中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为synchronized,以控制其对类的静态成员变量的访问。

  synchronized方法的缺陷:若将一个大的方法声明为synchronized将会大大影响效率,典型地,若将线程类的方法run()声明为synchronized,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何synchronized方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为synchronized,并在主方法中调用来解决这一问题,但是Java为我们提供了更好的解决办法,那就是synchronized块。


  2.synchronized块:通过synchronized关键字来声明synchronized块。语法如下:

synchronized(syncObject){
//允许访问控制的代码.
}
synchronized块是这样一个代码块,其中的代码必须获得对象syncObject(如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
分享到:
评论

相关推荐

    17.线程的同步机制-synchronized同步方法-synchronized方法锁定的是整个对象.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    30.线程的同步机制-synchronized同步语句-静态同步synchronized方法与synchronized(class)代码块.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    32.线程的同步机制-synchronized同步语句-解决synchronized方法无限等待问题.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java的线程同步机制synchronized关键字的理解_.docx

    synchronized 方法的缺陷是:同一个对象的不同线程之间会形成互斥,而对这个对象所属的 Class 所产生的另一对象却可以任意调用这个被加了 synchronized 关键字的方法。 synchronized 块 除了方法前用 synchronized...

    浅谈synchronized方法对非synchronized方法的影响

    下面小编就为大家带来一篇浅谈synchronized方法对非synchronized方法的影响。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    23.线程的同步机制-synchronized同步语句-synchronized方法的缺点.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java-synchronized详解.docx

    当一个线程调用 synchronized 方法时,Java 虚拟机(JVM)会检查该方法是否被锁定,如果该方法已经被锁定,其他线程无法访问该方法,直到锁被释放。这种机制可以确保在同一时间只有一个线程可以访问该方法,以避免...

    实例解析Java中的synchronized关键字与线程平安问题_.docx

    synchronized 方法被修饰的方法称为同步方法,其作用范围是整个方法,作用对象是调用这个方法的对象。synchronized 静态方法修饰一个 static 静态方法,其作用范围是整个静态方法,作用对象是这个类的全部对象。...

    15.线程的同步机制-synchronized同步方法-成员变量不是线程安全.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java中synchronized用法

    当 synchronized 关键字加在方法上时,它锁定的是调用这个同步方法的对象。例如,在以下代码中: public synchronized void methodAAA(){ //…. } 这个方法是同步方法,它锁定的是调用这个方法的对象,如 P1。当...

    该仓库为Java进阶部分课堂同步代码.rar

    而synchronized方法则会被翻译成普通的方法调用和返回指令,在VM字节码层面并没有任何特别的指令来实现被synchronized修饰的方法,而是在Class文件的方法表中将该方法的access_flags字段中的synchronized标志位置1,...

    synchronized与static synchronized的区别

    当某个线程调用synchronized方法的时候,就会给它加上了一个锁,其他线程就会无法访问,等到这个锁被释放,别的线程拿到这个锁的时候,才可以访问该方法。 static synchronized这个是“全局锁”或者是“类锁”,该锁...

    java 面试题 总结

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    超级有影响力霸气的Java面试题大全文档

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    实例解析Java中的synchronized关键字与线程安全问题

    synchronized方法,被修饰的方法成为同步方法,其作用范围是整个方法,作用对象是调用这个方法的对象。 synchronized静态方法,修饰一个static静态方法,其作用范围是整个静态方法,作用对象是这个类的所有对象。 ...

    java中数组列表ArrayList的使用.doc

    IsSynchronized 属性指示当前的 ArrayList 实例是否支持线程同步,而 ArrayList.Synchronized 静态方法则会返回一个 ArrayList 的线程同步的封装。 3. Count 属性和 Capacity 属性 Count 属性是目前 ArrayList 包含...

    千方百计笔试题大全

    72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket...

    net学习笔记及其他代码应用

    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。...47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可...

    java面试宝典

    72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信...

    多线程,高并发.pdf

    4. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。

Global site tag (gtag.js) - Google Analytics