`
一路向前
  • 浏览: 21672 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Java多线程同步Synchronized使用分析

阅读更多

在Java应用中,使用多线程进行工作的需要是越来越多,使用多线程进行工作,大大的提高了系统的工作效率,然而因此而产生的问题也是层出不穷,而且因为多线程而产生的问题跟踪是一个难题。

同步的概念:
    同步分为 方法同步 和 同步块  两种方式。

使用同步的原因
   1. 在系统中对访类要使用多线程进行访问;
   2. 在该类中有 类变量, 或者是 在类的方法中有访问 公共资源(如一个外部文件的读写)。

 

同步所锁定的内容是什么?

   无论你将Synchronized加在方法前还是加在一个变量前,其锁定的都是一个 类对象。 每一个对象都只有一个锁与之相关联。

 

 

下例中分情况的列举各种情况下的同步效果

 

1. Synchronized 加在方法上, (方法同步)

public  synchronized void function1(){ ……}

public  void function2(){

         synchronized (this){……}

    ……}

这两种写法的效果是一样的,锁定的都是类实例对象。

如果有一个 类实例对象:   inst = new ClassSynInst(),

另外有两个线程: threada,threadb,都调用了inst 对象,那么,在同一时间,如果 threada调用了inst.function1(),则threadb在该时间内不能访问inst.function1() 和 inst.function2(); 因为threada把inst这个对象的锁使用了,所以无法分给其它线程使用

但是,如果threada调用 inst1.function1(), threadb调用 inst2.function1(), 则可以同时进行,因为它们调用的是不同的ClassSynInst类对象实例。

 

 

2. Synchronized 加在变量上, (同步块)

 Object a = new Object();

 Object b = new Object();

 

public  void function1(){

         synchronized (a){……}

    ……}

public  void function2(){

         synchronized (b){……}

    ……}

 

这种情况下,是实现代码块锁定,锁定的对象是 变量 a 或 b; (注意,a 、b 都是非static 的)

如果有一个 类实例对象:   inst = new ClassSynInst(),

另外有两个线程: threada,threadb,都调用了inst 对象,那么,在同一时间,如果 threada调用了inst.function1(),则threadb在该时间内可以访问inst.function2(); 但不能访问  inst.function1() 的同步块, 因为a被 threada锁定了。

 

3. Synchronized 锁定的是 类变量 ,即static 变量

 

class Test{ 
 static Object o= new Object(); 

public static synchronized void f1(){ ……} 


public static void f2(){ 
synchronized(Test.class){ ……} 


public static void f3(){ 
try { 
synchronized (Class.forName("Test")) { ……} 

catch (ClassNotFoundException ex) { 



public static void f4(){ 
synchronized(o){ ……} 

 

以上4个方法中实现的效果都是一样的,其锁定的对象都是类Test,而不是类实例对象 ,即在多线程中,其共享的资源是属于类的,而不是属于类对象的。

在这种情况下,如果threada 访问了这4个方法中的任何一个, 在同一时间内其它的线程都不能访问 这4个方法

 

 

4. 类的方法中访问了多线程共同的资源, 且该资源是可变的,这种情况下也是需要进行同步的

例:

class test {

    static String path = “ file path”;    

    public void  readConfiFile(){

          synchronized (path){

              // 读取该path指定的文件。

         }

 

   }

 

     public void  writeConfiFile(){

        synchronized (path){

              // 写信息到该path指定的文件。

         }

   }

 

}

 

这种情况下,必须锁定为 类变量,而不能进行锁定类实例对象,因为这是变象的一种类资源共享,而不是类实例对象资源共享。

 

 

线程,成也其,败也其,用好了可以提升性能,用不好则会使系统后患无穷。

 

PS: 进行线程同步需要很大的系统开销, 所以,在使用时,如果不是必须的,则尽量不使用同步功能。

 

 

 

 

 

 

 

分享到:
评论
10 楼 huiqinbo 2012-03-09  
线程池更是一个麻烦的事
9 楼 zhangcs053 2011-04-15  
谢谢分享!
8 楼 malacca 2011-04-15  
线程确实是个很麻烦的东西呀!学习了,谢谢!
7 楼 Kanepan 2011-04-15  
非常不错..
当年也是一边做项目,一边摸索出这点规律的
6 楼 tangfei326 2011-04-14  
受教了。谢谢LZ...
5 楼 无根V稻草 2011-04-14  
学习了 谢谢LZ
4 楼 auldtiger 2011-04-14  
学习了!感谢
3 楼 wuhuajun 2011-04-14  
学习了,谢谢LZ!
2 楼 obullxl 2011-04-14  
建议用锁,很灵活。
1 楼 肉嘎嘎 2011-04-13  
学习了,谢谢LZ!

相关推荐

    Java多线程同步机制研究分析.pdf

    Java多线程同步机制研究分析 Java多线程同步机制是Java编程语言中的一种机制,它允许多个线程同时执行,提高了系统资源的利用率和安全性。但是,多线程中最重要的问题是线程的同步和共享资源的访问保护。本文通过对...

    Java多线程同步.pdf

    Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用synchronized关键字还不能...

    Java多线程同步机制的应用分析.pdf

    Java多线程同步机制的应用分析是指在Java语言中,如何使用同步机制来保护临界区,以避免多线程之间的冲突和错误。该机制通过管程机制和同步语法来保护临界区,使得多线程可以安全、高效地运行。 在多线程编程中,...

    基于Java多线程同步的安全性研究.pdf

    文章首先介绍了Java多线程同步的必要性和重要性,然后讨论了Java多线程同步机制的实现方法,包括使用synchronized关键字和Java.util.concurrent.locks包中的Lock对象。接着,文章讨论了Java多线程同步机制中可能出现...

    Java多线程同步论文.doc

    Java多线程同步是Java编程中至关重要的一部分,特别是在并发编程领域。Java提供了多种同步机制来确保线程安全,防止数据不一致性和竞态条件。在Java中,synchronized关键字是实现线程同步的关键,它提供了互斥访问,...

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

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    java多线程同步分析

    Java多线程同步是编程中一个重要的概念,特别是在并发编程中,它用于管理多个线程对共享资源的访问,防止数据的不一致性。线程同步是解决多线程并发问题的关键,确保线程按照一定的顺序执行,避免竞态条件。 线程在...

    Java多线程同步具体实例讲解 .doc

    总结起来,Java多线程同步是通过`synchronized`关键字实现的,它可以应用于方法或代码块,保证同一时刻只有一个线程能够执行特定的代码。通过合理使用同步机制,开发者可以有效地管理并发程序中的资源访问,避免数据...

    Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)

    Java 多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池) Java 多线程是 Java 语言中的一种并发编程机制,允许程序同时执行多个线程,以提高程序的执行效率和响应速度。 Java 多线程机制提供了...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    浅析Java多线程同步synchronized

    Java多线程同步synchronized Java多线程同步synchronized是Java编程语言中最基本的同步机制之一。它通过锁机制来实现多线程之间的同步,确保多个线程访问共享资源时的安全性。 在Java中,synchronized关键字可以...

    Java多线程同步具体实例.doc

    Java多线程同步是编程中一个非常重要的概念,特别是在并发编程中,用于解决多个线程访问共享资源时可能引发的数据不一致问题。本实例通过一个简单的火车票售票系统来演示同步机制的应用。 在这个实例中,我们创建了...

    Java多线程和同步

    Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料

    Java多线程同步问题分析.pdf

    Java多线程同步问题分析主要关注的是在并发环境中如何有效地管理共享资源,避免出现数据竞争和不一致性。在Java编程中,多线程是提升程序性能的重要手段,尤其是在服务器端应用和服务中。然而,当多个线程同时访问并...

    java 多线程 同步详解

    java 多线程同步详解 synchronized 的使用,锁定对象 ,锁定类 区别

    JAVA多线程练习题答案。

    JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等...

    Java多线程同步Synchronized深入解析

     1、在系统中对访类要使用多线程进行访问;  2、在该类中有 类变量,或者是 在类的方法中有访问公共资源(如一个外部文件的读写)。  同步锁锁定的内容是什么?  无论你将Synchronized加在方法前还是加在...

    基于Java synchronized同步锁实现线程交互.pdf

    本文通过实例展示了使用synchronized、wait()和notify()实现线程交互的方法,帮助用户在使用Java多线程的场景有效避免多线程带来的不安全问题。理解Java线程各状态之间的关系及其切换,能够帮助用户在使用Java多...

    java synchronize 线程同步

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,主要目的是解决多线程环境下的数据安全问题。当多个线程访问共享资源时,如果没有适当的同步控制,可能会导致数据不一致或者竞态条件等问题。线程同步...

    java多线程笔记

    四、 使用synchronized关键字要注意以下四点 39 五、 关于同步和锁定的一些问题 41 Java线程:并发协作-线程的交互 47 Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的...

Global site tag (gtag.js) - Google Analytics