`

java syncronized关键字详解

    博客分类:
  • java
阅读更多
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。
  1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
  
public synchronized void accessVal(int newVal); 

  synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
  在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
  synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。
  2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
  
synchronized(syncObject) { 
  //允许访问控制的代码 
  } 

    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 f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
  六、以上规则对其它对象锁同样适用
分享到:
评论

相关推荐

    Java 同步锁(synchronized)详解及实例

    Java中的同步锁,即`synchronized`关键字,是Java多线程编程中用于解决并发问题的重要机制。它确保了对共享资源的互斥访问,防止数据的不一致性。当我们有多线程环境并涉及到共享数据时,可能会出现竞态条件,就像...

    两种单例实现方式

    两种单例实现方式 ...*syncronized 关键字可能会带来性能问题:在高并发环境下,synchronized 关键字可能会导致性能问题。 两种单例实现方式都有其优缺,选择哪种方式取决于实际应用场景和需求。

    Java多线程编程之CountDownLatch同步工具使用实例

    在Java多线程编程中,CountDownLatch是一种常用的同步工具,...在实际开发中,根据需求选择合适的同步工具,如Semaphore(信号量)、CyclicBarrier、Syncronized关键字等,能够极大地提高多线程编程的效率和可维护性。

    android代码

    因此,需要正确处理线程间的通信,如使用Handler、Message或者Syncronized关键字来保证数据的一致性。 8. **资源管理**: 图片、音频等资源的加载和释放是非常重要的,特别是在资源有限的移动设备上。使用...

    面试宝典已回答篇 问答题

    4. 可重入锁与syncronized的区别:ReentrantLock除了synchronized的功能外,还提供了等待可中断、公平锁和绑定多个Condition的功能。 三、分布式系统相关 1. 分布式的理解:分布式就是把一个需要非常巨大的计算...

    UMT的绕线机-项目开发

    标签“coil winder syncronized stepper motors”揭示了绕线机的核心组件之一:同步步进电机。同步步进电机在绕线设备中扮演着关键角色,它们能提供精确的角位移控制,确保线圈绕制的精度。同步意味着电机的旋转速度...

    android面试题集锦

    - 掌握Syncronized、Lock、ReentrantLock等同步机制的使用。 - 了解Android的 Handler-Looper-Messenger 消息传递机制。 7. **权限管理** - 理解Android权限系统的变化,从Android 6.0(API Level 23)的运行时...

Global site tag (gtag.js) - Google Analytics