`
blues1021
  • 浏览: 139776 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

synchronized对象同步控制小结

阅读更多

JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。
在进一步阐述之前,我们需要明确几点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
1.  synchronized修饰方法,
示例代码如下:
Public synchronized void method(){
//….
}
等同于:
public void method()
{
synchronized (this)      //  (1)
{
   //….

}
}
他锁定的是调用这个同步方法对象。也就是说,
当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互斥,达到同步的效果。 但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。
2.synchronized作用于同步块 ,示例代码如下:

public void method(SomeObject so) {
synchronized(so)

{

  //…..

}
}
这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。也就实现了object1,object2在块上的完全同步,但当有且不是 private instance(数据成员或对象) 和synchronized getInstance方法时情况会发生变化。
当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
class Foo implements Runnable
{
private byte[] lock = new byte[0];  // 特别的instance变量


  Public void method()
{


       synchronized(lock) { //… }

}
//…..
3.synchronized作用于static方法 ,示例代码如下:
Class Foo
{

public synchronized static void method1()   // 同步的static 函数

{
//….

}
public void method2()

{
synchronized(Foo.class)   //  class literal(类名称字面常量)

}
}

代码中的method2()方法是把class literal作为锁的情况,他和同步的static函数产生的效果是相同的,
取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了),在Class上实现同步,也就不存在obj1,obj2非同步情况。但当有且不是private instance(数据成员或对象)和 synchronized getInstance方法时情况会发生变化。
能够推断:假如一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为他们的锁都不相同。A方法的锁是Obj所属的那个Class,而B的锁是Obj所属的这个对象。

更有一些技巧能够让我们对共享资源的同步访问更加安全:
(1)  定义private 的instance变量(同步访问的资源数据)+他的 get方法,而不要定义public/protected的instance变量。假如将变量定义为public,对象在外界能够绕过同步方法的控制而直接取得他,并改变他。这也是JavaBean的标准实现方式之一。

(2)  假如instance变量是个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了.

参考自:
http://leo-faith.iteye.com/blog/177779


分享到:
评论

相关推荐

    简单了解Java synchronized关键字同步

    小结 本文主要介绍了 Java 中的 synchronized 关键字的使用方法和原理,包括同步块、同步方法、非静态同步方法、静态同步方法等。通过本文的学习,读者可以更好地理解 synchronized 关键字的使用方法和原理,並且...

    synchronized详解

    #### 小结 `synchronized`是Java中一种非常重要的同步机制,用于控制多线程环境下的并发行为。正确地使用`synchronized`可以帮助开发人员避免并发编程中的常见问题,如数据不一致、死锁等。然而,过度使用`...

    深析Synchronized关键字(小白慎入,深入jvm源码,两万字长文)

    ### 三、小结 Synchronized关键字在Java并发编程中扮演着重要角色,它提供了一种简单的线程安全机制。从Java SE 1.6开始,通过引入偏向锁和轻量级锁,显著提高了多线程环境下的性能。理解Synchronized的工作原理和锁...

    Java多线程小结

    ### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...

    singleton、回调函数、sizeof等小结.pdf

    为解决这个问题,可以使用双重检查锁定(Double-Check Locking)机制,即在创建对象前先判断实例是否已存在,若不存在再进行同步控制,创建实例。在Java中,可以使用`synchronized`关键字来实现同步,但在C#中,可以...

    java基础知识从业必备知识点结构图小结.rar

    线程的创建可以通过实现Runnable接口或继承Thread类实现,同时线程同步(synchronized关键字、wait/notify、Lock接口等)是解决并发问题的关键。 - **网络编程**:Java提供了Socket和ServerSocket类,用于实现TCP/...

    Java SE实践教程 源代码 下载

    1.3 小结 35 第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用...

    java笔试题小结

    ### Java笔试题小结 #### 1. Java 字符串(String) **问题**: String 类的特点是什么?与 StringBuffer 的区别? **分析与解答**: `String` 类在 Java 中是不可变的,即一旦创建了一个字符串对象,其内容就不能...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    Java(J2SE、J2EE)学习小结

    同步方法有`synchronized`关键字、`wait()`/`notify()`机制和`Lock`接口。 5. 类的执行顺序:在继承中,父类的构造器先于子类执行。示例代码中的输出顺序表明了这一点。 6. 内部类:内部类分为成员内部类、局部...

    Java线程类小结(附思维导图)

    我们将探讨`Thread`类、`Runnable`接口、线程的状态、线程同步以及线程池等相关知识点。 1. **线程基础** - **Thread类**:Java中的`Thread`类是所有线程的基类,包含了启动、控制和停止线程的方法,如`start()`、...

    Java中synchronized关键字引出的多种锁 问题

    小结:只有一个线程使用锁的情况下,synchronized 使用的锁为偏向锁。如果锁竞争激烈,可以通过配置 JDK 禁用偏向锁。 ### 2. 轻量锁 一把锁不止一个线程使用,则偏向锁膨胀为轻量锁表现:线程获取轻量锁时,会...

    Java内存分配、管理小结.doc

    - 对于非静态变量,线程间的共享需要通过同步机制(如synchronized关键字)来保证线程安全。 7. **反射(Reflection)**: - 反射是Java提供的一种动态类型机制,允许程序在运行时检查类的信息,如方法、字段和...

    Java典型模块

    1.4 小结 第2章 Java面向对象编程 2.1 面向对象的一些概念 2.1.1 面向对象涉及的概念 2.1.2 类和对象 2.2 面向对象的一些特性 2.2.1 继承特性 2.2.2 多态特性 2.2.3 封装特性 2.3 Java中实现的面向对象特性 2.3.1 ...

    java.util.vector中vector小结

    - **线程安全**:`Vector`类的所有操作都是线程安全的,这意味着在多线程环境中,你不需要额外的同步控制就能安全地使用它。 - **动态扩容**:`Vector`会自动调整容量以适应存储更多的元素,就像`ArrayList`一样。...

    java面试精品全集[线程部分]

    ### 小结 本文通过对Java线程相关的知识点进行了详细的阐述,旨在帮助读者更好地理解Java线程的运作机制以及线程间的通信与协作方式。希望读者能够通过本文的学习,掌握Java多线程编程的基础知识,并能够在实际开发...

Global site tag (gtag.js) - Google Analytics