`

java 实践中的一些问题(2)

 
阅读更多

问题四、java中对象相等的判断——equals

 

        在平常编写代码的过程中,我们经常会需要判断2个对象是否相等,下面就谈谈如何实现满足需求的对象相等方法。

 

       1>  一般自己来实现equals方法可以按照以下几个步骤去实现

 

1、如果某个class的2个对象占据不同的内存空间,也可以逻辑上认为相等,那就得为这个class定义equals();

2、检查“==”是否成立,这是最严格的相等判断;

3、比较class中的相关属性值是否相等,这里按照需要,逻辑上要求哪些字段相等;

4、如果该类的base class实现了equals方法,就应该调用super.equals();

5、如果只允许同一个class所产生的对象被视为相等,则通常使用getClass();

6、如果希望子类和父类的对象也能相等,则使用instanceof,注意这里可能会带来非对等性;

 

      2>  一般实现equals方法的同时要求同时实现hashcode方法

 

       因为java里面必须保证相等的对象必须要有相同的hashcode,但是不保证不同的对象就有不同的hashcode。所以假如在实现equals()方法时,判断2个对象的属性a和b都相等时,对象就相等,此时实现hashcode方法时,必须基于这2个字段去计算,从而保证equals的2个对象具有相同的hashcode。

下面是一个实现类的equals方法的典型例子:

 

class Person {

String name;

String age;

//set method

//get method;

  public boolean equals(Object obj){

      if(this == obj){

          return true;

      }

 

     if(obj!=null && obj.getClass() == obj.getClass){

           Person person = (Person)obj;

           if(this.name.equals(person.name)  && this.age.equals(person.age)){

                      return true;

           }

     }

        return false;

  }

       public int  hashCode(){

          return this.name.hashCode()*31+this.age.hashCode();

       }

}

 

 问题五、java多线程中经常遇到的问题

 

       大多数时候我们使用的是语言层次上的锁来解决多线程环境中对共享资源的访问问题,也就是Sychronized关键词来修饰。它修饰的是对象而不是方法或代码,在我的另一篇文章java中的进程与线程及java对象的内存结构中有提到java对象头里面对锁相关信息的存储。

 

Sychronized的用法:

同步实例方法,锁定这个方法对应的当前实例对象。

同步静态方法或class对象,锁定当前对象的Class对象。

同步对象或方法块,锁定这个对象。

 

需要通过wait方法来阻塞线程、notifynotifyAll方法来唤醒线程。

JDK中的suspend()和stop方法已经不建议再使用,前者可能会由于资源不释放造成死锁,后者可能会产生不可预知的错误。

编写同步代码的时候主要注意2个点:

1、对同步资源的可见性的保证

2、对同步资源操作的原子性保证

像JDK中应用层次上的同步框架AQS,就是通过volatile来保证可见性及CAS操作来保证原子性,从而实现了一系列的锁。

 

1>、 在进行同步控制时,使用private关键字修饰同步资源以及访问该资源的方法,这样才能保证能够真正的实现同步。否则,外部程序可以绕过同步控制而直接修改同步资源出现问题。

2>、避免无谓的同步控制,尽量使得同步控制的锁粒度最细,这样才能使性能影响尽可能的小。

3>、对于共享变量的访问,除了使用Sychronized(每次取得和释放锁才进行主存和私有内存的一致化),还可以使用volatile,这个关键词修饰的变量,在每次访问时就会进行主存和私有内存的一致化,从而保证可见性。

4>、当需要锁定多个对象进行一些复杂的操作时,以固定而全局的顺序去取得多个locks以避免死锁。

5>、wait和notify都是在获得锁的情况下才能调用的方法,在使用这些方法时要使用旋锁。因为当一个线程被唤醒,它必须重新检查它的等待条件,因为当初的等待条件有可能在此时又变化了。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java2上机实践1初识java

    在这个“Java2上机实践1初识java”的过程中,你不仅会学到Java的基础知识,还会提升问题解决和逻辑思维能力。通过这些实例,你将逐渐理解面向对象编程的概念,学会如何创建类、对象,以及如何利用方法封装代码。此外...

    JAVA项目实践合集

    "JAVA项目实践合集"是一个综合性的资源集合,包含了多个Java项目的源代码和实践案例,旨在帮助学习者提升Java编程...记得在实践中不断探索和总结,这样才能真正提升自己的编程水平,达到“好好学习,天天向上”的目标。

    Java诊断利器Arthas排查问题实践.pptx

    Java 诊断利器 Arthas 排查问题实践 Arthas 是 Alibaba 开源的 Java 诊断工具,于 2018 年 9 月开源,目前在 Github 上获得了 11,000 多个星标。 Arthas 的主要功能特性包括查看类加载情况、反编译类、热更新类、...

    东南大学java实践

    在Java实践中,初学者会接触到如类和对象、继承、封装、多态等核心概念。银行和公司类的构建,会让学习者深入理解如何利用接口和抽象类来设计系统结构,如何使用异常处理来增强程序的健壮性,以及如何使用集合框架...

    Java程序设计实践.doc

    在Java程序设计实践中,理解Java基础知识是非常重要的。下面是Java基础知识的几个重要方面: 1. 类和对象:在Java中,类是对象的模板,对象是类的实例。类定义了对象的属性和行为,对象则是类的实例化。 2. 变量:...

    Java中文问题及最优解决方法

    由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题。于是我给出此...

    java2上机实践5代码及练习答案

    5. **异常处理**:Java的异常处理机制是编程实践中不可或缺的部分,学生可能需要学会使用try-catch-finally语句块来捕获和处理运行时错误。 6. **输入/输出流**:Java的IO流用于读写文件,实验可能要求学生实现文件...

    java上机实践指导教程

    Java上机实践指导教程是为帮助Java初学者和进阶者深入理解并熟练掌握Java编程技术而设计的一系列实践课程。...通过这个Java上机实践指导教程,你将不仅学习到Java语言本身,还能获得实际开发中的宝贵经验。

    java社会实践报告

    在此次Java社会实践过程中,我于重庆达内科技有限公司进行了实习,主要学习了Java的基础、高级以及Java Web编程技术。这段实习经历为我提供了宝贵的实践经验,不仅提升了我的专业技能,同时也锻炼了我的团队协作和...

    JAVA并发编程实践(中文)含源码

    通过阅读《JAVA并发编程实践》并实践其中的源码,开发者可以系统地学习到Java并发编程的各种技巧,提升解决实际问题的能力。无论是初级开发者还是有经验的工程师,都能从中受益匪浅,为构建高效、稳定、可扩展的并发...

    JAVA并发编程实践

    2. **同步机制**:Java提供了多种同步机制,包括`synchronized`关键字、`volatile`变量、`Lock`接口(如ReentrantLock)以及`java.util.concurrent`包中的工具类(如Semaphore、CyclicBarrier)。它们用于保证多线程...

    Java 设计模式最佳实践

    Java 设计模式最佳实践是...在实践中,可以根据具体需求灵活组合和应用这些模式,以实现高效、可扩展的代码设计。通过学习和实践《Java 设计模式最佳实践》中的示例,开发者可以加深对设计模式的理解,提高开发效率。

    大型网站系统与Java中间件实践(书签版)

    希望读者通过《大型网站系统与Java中间件实践》可以了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型网站的 Java 中间件的实践经验。对于有一定网站开发、设计经验,并想了解大型网站架构和...

    分布式Java应用基础与实践pdf

    在Java中,分布式系统主要依赖于一些核心的技术和框架,如RMI(Remote Method Invocation)、JMS(Java Message Service)、EJB(Enterprise JavaBeans)、JNDI(Java Naming and Directory Interface)以及近年来...

    Java 程序设计与项目实践

    在项目实践中,读者将有机会运用这些知识来解决实际问题,可能的项目实践内容包括: 1. **简单计算器**:构建一个能进行基本算术运算的GUI应用程序。 2. **学生管理系统**:设计一个包含学生信息录入、查询、修改...

    Java并发编程实践(中文)

    Java并发编程实践(中文) 高清pdf 带书签。 详细讲解了java并发知识,推荐

    Java上机实践指导教程

    在Java编程的学习过程中,上机实践是至关重要的环节,它能帮助我们巩固理论知识,提升实际操作能力。《Java上机实践指导教程》正是这样一本旨在帮助初学者和进阶者提升Java编程技能的实用指南。这本书涵盖了大量实战...

    10年6月北大自考上机java实践题目

    【Java实践题目解析】 在10年6月的北大自考中,有三道与Java相关的实践题目,分别涉及基础的算法实现、GUI事件处理以及面向对象编程。这些题目旨在检验考生对Java语言的理解和应用能力,同时也包含了计算机应用的...

Global site tag (gtag.js) - Google Analytics