Java核心技术讲解学习二


LuckQI

在这里你可以得到不只是技术,关注即可习得新技能

 


继续我们的Java核心知识点的学习。上面一篇说过虚拟机还有Java世界平台的简单知识,还顺便总结了Error和Exception相关内容看相关内容,请阅读Java核心技术讲解学习一。我们今天说点别的引用还有final,finally ,finalize三者相关的内容。

final.finally,finalize 

   我们平常在使用的时候一般在变量中使用final,但是他不仅仅可以用在变量上,还可以用在方法上还有类上。那么final的作用是什么呢?

  •  使用在类上 代表该类不可继承扩展。

  •  使用在变量上,代表变量不可修改,如果是对象那么不可变的是引用问题。可以避免意外复制导致的变成错误。更加方便的是在并发编程上,我们可以避免额外的同步 ,省去了一部分的拷贝消耗

  •  使用在方法上,表示该方法不可重写。

   finally我们通常用来与try -catch 一块使用。 比如下面锁的引用,我们一般会在使用的时候最终将锁进行释放


try{
           lock.lock();
           lock.getHoldCount();
           lock.getQueueLength();
           lock.getWaitQueueLength(condition);
           lock.hasQueuedThread(Thread threads) ; //作用查询指定的线程是否在等待获取此锁定
            lock.hasQueuedThreads(); //查询 是否有线程正在等待获取此锁定。
           lock.hasWaiters(condition); // 查询是否有线程正在等待此锁定有关的condition条件。
            lock.isFair(); // 判断是不是公平锁
           lock.isHeldByCurrentThread(); // 查询当前线程是否保持此锁定
           lock.isLocked(); //作用是查询此锁定是否由任意线程保持。
           lock.lockInterruptibly(); // 如果当前线程未被中断,则获取锁定。如果已经被中断则出现异常
            lock.tryLock();  //仅在 调用时锁定未被另一个线程保持的情况下,才获取该锁定
            condition.await();
           condition.signal();
           condition.signalAll();
           System.out.println("打印内容: " + Instant.now());
           Object object = new Object();
           Thread thread  = new Thread();
           thread.join();

           lock.wait();
           lock.notify();
           lock.notifyAll();

           ReentrantReadWriteLock  readWriteLock = new ReentrantReadWriteLock();
           readWriteLock.readLock().lock();
           readWriteLock.writeLock().lock();

       }catch (Exception e){
           e.printStackTrace();
       }finally {
           lock.unlock();

       }


但是在Java7以后我们可以使用try -with-resources ,这样能减少我们的编码量。让代码更加整洁

try(BufferedInputStream  iso = new BufferedInputStream(new InputStream() {
           @Override
           public int read() throws IOException {
               return 0;
           }
       });
       ){
           System.out.println("打印内容");
       }catch (Exception e){
       }


还有一点就是finally中代码执行的问题。

如果try中有return finally中也有return 那么结果会是哪个呢? 答案是我们会的得到return 中返回的结果。因为在try中放回的结果因为是在方法内那么结果内容是放在栈中的,finally中的结果会把该结果覆盖掉。但是这个是说的引用对象。对于值的返回是没有影响的。

我们常说finally中的代码如果不出错的情况下一定会执行。那finally不会别执行的情况是什么呢?

try{
           System.exit(1);  //程序在这里执行退出 finally就不执行了
       }catch (Exception e){
           e.printStackTrace();
       }finally {
           System.out.println("输出");
       }
int  i = 1/0 ;   //在这里发生异常 程序直接 执行退出。
try{
           System.exit(1);  //程序在这里执行退出 finally就不执行了
       }catch (Exception e){
           e.printStackTrace();
       }finally {
           System.out.println("输出");

finalize  是被设计成在对象被垃圾回收前调用,该方法作用是清理一些垃圾回收不能处理的特殊情况内存空间。虽然会在垃圾回收前调用,但是在下一次垃圾回收动作的时候才会真正的执行清理空间。每次在垃圾回收前使用,JVM每次进行额外处理。就会每次增加JVM的压力。所以不建议使用该方式去释放特殊空间的内存。

如今的Java平台,开始采用java.lang.ref.Cleaner 代替finalize.Cleaner 的实现使用了幻象引用。这是一种常见的post-mortem清理机制。这个Cleaner 的操作都是独立的,有自己的运行线程,避免意外死锁的问题。

引用的几种分类

  在平常代码中,我们基本上没有注意过引用的使用,那么引用究竟是什么呢。或者有几种类型呢?

引用我们一般分为 强引用,软引用,弱引用,  幻象引用四类型

 我们使用不同的引用类型,一主要是体现在对象的不同的可达性状态和对垃圾收集的影响。

强引用  

   强引用是指我们平常普通对象的引用,只要还有一个强引用指向对象,那么代表对象还是存活的状态,这样垃圾收集器在进行回收的时候就不会进行操作。如果没有其他对象对其引用了或者超过了作用域的范围会显示的将其强引用赋值为null ,进行垃圾回收。如果一直保持着强引用状态。垃圾回收器是不会进行回收的。

软引用

   软引用相对于强引用弱化的一种引用,他可以让对象豁免一些垃圾回收,只有当JVM认为内存不组的时候才会进行回收。软引用是实现内存敏感的缓存,如果有空间内存,就可以暂时保留缓存。当内存不足才清理掉。但是垃圾回收的时候会进行二次群人是否保持的**软引用**的情况。保持这个状态才会进行清理掉

弱引用

   弱引用并不能是对象豁免垃圾回收进行收集,仅仅是提供一种访问在弱引用状态下对象的途径。这就可以构建一种没有特定约束的关系。当试图获取时对象还在,那么就使用,否则重新实例化,这种方式在缓存中使用比较多。但是垃圾回收的时候会进行二次群人是否保持的**弱引用**的情况。保持这个状态才会进行清理掉

幻象引用

   幻象引用,我们没有手段去进行访问幻象引用,这种引用只是用来提供对象被finallze以后,做某些事情的机制。比如利用幻象引用进行对象的创建和销毁。




戳下面的原文阅读,更有料
在软件设计里到处都是模式,框架。有次朋友问什么是模式?我也在学习中,就我的学习经验,给出以下小结。(注意:个人观点,仅供参考,欢迎指正。)??1.什么是模式???模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。??Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。??模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然会出现很多模式。??什么是框架???框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。??2.为什么要用模式???因为模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法。??为什么要用框架???因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。??框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。??软件为什么要分层???为了实现“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源…总之好处很多啦:)。??3.以下所述主要是JAVA,J2EE方面的模式和框架:??常见的设计模式有什么???首先,你要了解的是GOF的《设计模式--可复用面向对象软件的基础》一书(这个可以说是程序员必备的了),注意:GOF不是一个人,而是指四个人。它的原意是Gangs Of Four,就是“四人帮”,就是指此书的四个作者:Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides。这本书讲了23种主要的模式,包括:抽象工厂、适配器、外观模式等。??还有其他的很多模式,估计有100多种。??软件设计模式太多,就我的理解简单说一下最常见的MVC模式。??MVC模式是1996年由Buschmann提出的:??模型(Model):就是封装数据和所有基于对这些数据的操作。??视图(View):就是封装的是对数据显示,即用户界面。??控制器(Control):就是封装外界作用于模型的操作和对数据流向的控制等。??另外:??RUP(Rational Unified Process)软件统一过程,XP(Extreme Programming)极端编程,这些通常被叫做“过程方法”,是一种软件项目实施过程的方法论,它是针对软件项目的实施过程提出的方法策略。也是另一个角度的模式。??4.常见的JAVA框架有什么???WAF:??全称:WEB APPLICATION FRAMEWORK??主要应用方面:EJB层,(WEB层也有,但是比较弱)。??主要应用技术:EJB等??出处:http://java.sun.com/blueprints/code/index.html??简述:这是SUN在展示J2EE平台时所用的例子PetStore(宠物商店系统)里面的框架。是SUN蓝皮书例子程序中提出的应用框架。它实现了 MVC和其他良好的设计模式。SUN的网站上有技术资料,最好下载PetStore来研究,WEBLOGIC里自带此系统,源码在beaweblogic700samplesserversrcpetstore。这是学习了解J2EE的首选框架。??免费。??Struts:??主要应用方面:WEB层。??主要应用技术:JSP,TagLib,JavaBean,XML等??出处:http://jakarta.apache.org/struts/index.html??简述:这是APACHE的开源项目,目前应用很广泛。基于MVC模式,结构很好,基于JSP。Jbuilder8里已经集成了STRUTS1.02的制作。??免费。??简述WAF+STRUTS结合的例子:WEB层用STRUTS,EJB层用WAF:??JSP(TagLib)——>ActionForm——>Action ——> Event——>EJBAction——>EJB ——>DAO——>Database JSP(TagLib)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值