`
fyumin
  • 浏览: 6195 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java多线程深入体会及分析

阅读更多

对于java中多线程并发问题之前理解一直不到位,最近在使用synchronized关键字时发现了很多使用误区。

解析1:分析以下代码

class  Info{

      public synchronized add(){

               System.out.println("add");

      }
      public synchronized delete(){

               System.out.println("delete");

      }

}

从以上代码可以得知同一对象的add和delete方法都不允许同时被2个线程访问,从这个角度理解是没有问题的。

我们再对上面代码进行改造,让其变成一单例类

解析2:分析以下代码

class  Info{

      private static Info  Info1=null;

      private Info(){}                     //私有构造器

      //获得单例统一如口

      public synchronized static Info getInstance(){

               if(info1==null)

                  info1=new Info();

               return info1;

      }
      public synchronized add(){

               System.out.println("add");

      }
      public synchronized delete(){

               System.out.println("delete");

      }

}

以上代码在整个jvm运行过程中只存在一个实例,如果此时线程A正在访问方法add(),那么其它线程均不可访问该类的任何带有synchronized 关键字的方法,因为synchronized关键会对当前实例加锁,即每个java实例都会有一把实例锁,当线程A访问add()方法时即对该实例加了一把锁,当其它线程访问带有synchronized关键字的方法delete()时jvm会先检察当前对象是否被加锁,如果已加锁则会被阻塞。



解析3:分析以下代码

class  Info{

      public static  synchronized add(){

               System.out.println("add");

      }
      public static synchronized delete(){

               System.out.println("delete");

      }
      public static  void edit(){

               System.out.println("delete");

      }
     public synchronized void view(){

               System.out.println("delete");

      }

}

我们现在开始分析一种特殊形式的同步过程

假如线程A正在访问add()方法,那么其它线程均无法访问delete方法,但edit()、view()方法是可以访问的,因为在静态方法上使用synchronized关键字表示对类进行加锁,当其它线程访问该类带有synchronized关键字的方法时,jvm都会判断该类是否被加锁,如果被加锁则会被阻塞。但是未加synchronized关键字的方法是可以被执行,并且view()方法虽然加了synchronized但由于是属于Info类的,所以也不会被锁。



总结以上内容

Synchronized是java语言级别内置的同步机制,不同与java中的Semaphore,Mutex。Synchronized的背后机制是Java在语言级上的锁机制:

类锁:对于每一个类,自动配套一个类锁,该锁临界量为1
实例锁:对于每一个类实例化后的一个对象,自动配套一个对象锁,该锁临界量为1
对于类锁,目前注意到,只能应用到类得某个方法上:

静态方法锁:static synchronized method();
对于实例锁,有以下几种方式:

非静态方法锁:synchronized method();
代码块锁:synchronized{ }或synchronized(this){ }
指定类实例锁:synchronized(Object ob){ }
非静态方法锁与代码块锁实质都一样,是对当前所属类得实例加锁。而指定类实例锁,是对括号里的对象ob加锁,这一点很有意思,灵活运用指定类锁可以构建一些稍微负责的并行程序模型。

其中类锁与实例锁各自独立,不相互冲突,一个synchronized 指定锁,要么是类锁,要么是实例锁,是互斥的


最后一点是synchronized关键词不能被直接继承,子类在继承负责,覆盖父类的synchronized方法时候,必须同样显示用synchronized关键词。而子类如果不覆盖父类synchronized关键词的非静态方法,直接继承并使用父类的非静态方法时,父类的synchronized字段在子类对象仍然是有效的。

好吧,总结就到此为至,分析的不是太深入,希望这篇文章能启发大家的思想。

如果有不同建议的同学可以给我留言!

 

0
0
分享到:
评论
1 楼 a12053094 2012-03-03  
add方法等没有返回参数,编译不通过

相关推荐

    Java 多线程学习总结归纳(附代码)

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。下面是对Java多线程学习的详细解析。 1. **多线程概述*...

    Java线程学习和总结

    本文档("Java线程学习和总结.htm")可能包含了更多关于线程的实例、源码分析和常见问题解决方案,你可以通过阅读来进一步加深对Java线程的理解。同时,"Java线程学习和总结.files"目录下的文件可能是与文章相关的...

    多线程实验报告.docx

    在本实验中,我们主要探讨的是Java编程中的多线程技术及其在实际应用中的实现。...总的来说,这个多线程实验旨在让学生通过实际操作,加深对Java多线程编程的理解,提高编程技能,并锻炼解决问题的能力。

    实验十 java多线程(文档中包含可执行源码)

    实验十的目的是让学生掌握Java多线程的概念和实践,通过创建一个小球跳动的动画程序来演示线程在处理并发任务中的应用。这个程序需要达到无闪烁、高速显示且内存占用小的效果,这通常需要使用双缓冲技术。双缓冲是一...

    多线程点餐系统(包括服务端和客户端)

    Java多线程是Java编程中的重要特性,它允许程序同时执行多个任务,提高系统效率和响应速度。在点餐系统中,多线程的应用主要体现在以下几个方面: 1. 客户端并发处理:每个客户请求可以视为一个独立的线程,使得多...

    自己总结的多线程

    本文从多线程的基础概念出发,深入探讨了Java中多线程的实现机制及线程安全问题,并介绍了几种常见的设计模式(包括单例模式、工厂模式和适配器模式),这些模式有助于解决多线程环境下的常见问题。通过对这些知识点...

    java学习心得体会

    在并发编程方面,Java提供了线程和进程的概念,理解线程同步和互斥、死锁以及如何使用synchronized关键字和wait/notify机制来控制并发行为,是编写高效多线程程序的基础。 最后,Java标准库(JDK)提供了大量的类和...

    Java日记-我的学习心得

    本文将基于一篇关于Java多线程的学习心得文章,深入探讨Java中的多线程概念、原理及其实际应用。 #### 二、Java多线程基础 Java提供了内置的支持来简化多线程编程的过程。这主要体现在以下几个方面: 1. **语言...

    多线程实验

    【多线程实验】是计算机科学中的一个重要实践环节,尤其在Java编程中,多线程技术是实现并发处理和高效能应用的关键。本实验旨在帮助学生深入理解和掌握线程的相关概念,包括线程调度机制、线程同步机制,以及如何在...

    JAVA语言模拟ATM取款机体会

    6. **多线程**:如果模拟器需要同时处理多个用户请求,可以使用Java的多线程特性。例如,每个用户操作可以在单独的线程中运行,以提高并发性能。 7. **GUI设计**:为了提供用户友好的界面,可以使用Java的Swing或...

    多线程的总结

    本篇文章将深入探讨多线程的理论,总结其核心概念,并分享一些心得体会。 首先,我们需要理解线程的定义。线程是操作系统分配CPU时间的基本单位,一个进程可以包含一个或多个线程。与创建新进程相比,创建新线程...

    java体会总集java体会总集

    总的来说,Java体会总集涵盖了从基础到高级的各个方面,包括但不限于语法、异常处理、集合框架、多线程、I/O、反射、注解和模块系统。通过不断学习和实践,开发者可以深入理解Java语言的精髓,提高编程技巧,并能够...

    java培训班心得体会___五篇.docx

    在Java语言优点的讨论中,提到了Java的简洁性、面向对象、多线程、分布性和安全性。Java的简洁性在于它摒弃了C++中复杂的特性,如操作符重载和多继承,更易于理解和使用。面对对象特性体现在类和接口的使用,支持...

    Java坦克大战源码(附需求文档说明)

    9. **学习资源**:"史上最完整的学习视频资料1700G.docx"可能包含了丰富的学习材料,从初级到高级,涵盖Java语言、多线程、GUI编程等多个方面,是深入理解Java坦克大战源码的好帮手。 总之,Java坦克大战源码的学习...

    飞机大战_MoAC

    总结来说,"飞机大战_MoAC"项目为我们提供了一个实践Java多线程和事件监听器的好例子。通过这个项目,我们可以学习如何构建一个多线程的游戏环境,以及如何通过键盘和按钮监听器来增强游戏的互动性。这样的实战经验...

    JAVA做完项目心得

    5. **多线程**:为了提升程序的并发性能,我接触了Java的多线程编程。通过实现Runnable接口或继承Thread类,我学会了如何创建和管理多个执行线程,理解了同步和互斥的概念,以及synchronized关键字的应用。 6. **...

    2022年java实训心得体会范文.docx

    实训项目可能包括基础的控制结构、类和对象、异常处理、集合框架等,以及更高级的主题如多线程、网络编程和数据库连接。 在实训中,学生们了解到理论知识的重要性,但同时也认识到实践经验的价值。他们学会了如何将...

Global site tag (gtag.js) - Google Analytics