java基础
文章平均质量分 71
涵盖一些Java基础知识
老朱.
业余时间喜欢写点技术博客,读点无用之书。想阅读我更多原创的非技术类文章,可以关注我的公众号 老朱的读书随想
展开
-
Java多线程[1]:创建线程
由于Java中的多线程写起来比较长,为了使博客读起来更加简洁,我决定将java多线程部分拆分开来写。本篇是第一节,创建线程。Java定义了创建线程的两种方法:实现Runnable接口扩展Thread类 接下来,我们通过实现Runnable接口的方式来创建线程原创 2015-09-30 14:23:02 · 647 阅读 · 0 评论 -
Java多线程[2]:join() 方法
join()方法的使用场景假设我们在主线程中创建了一个线程,这个线程要执行很长时间,我希望这个线程执行完并结束以后,主线程再结束,也就是说,我希望主线程能够晚于子线程结束。因为我们不知道子线程要执行多久,所以,也不知道主线程要等待多久,所以,join()方法诞生了。原创 2015-09-30 14:53:23 · 962 阅读 · 1 评论 -
Java多线程[3]:线程同步(互斥)
当两个或多个线程需要访问共享资源时,它们需要以某种方式确保每次只有一个线程使用资源,实现这一目的的过程称为线程同步。Java为线程同步提供了很好的支持。监视器的概念常用来解决线程同步问题。监视器是用做互斥锁的对象。在任何时刻,只有一个线程可以拥有监视器。当线程取得锁时,也就进入了监视器。其它所有企图进入加锁监视器的线程都会被挂起,直到第一个线程退出监视器。原创 2015-09-30 16:26:27 · 1233 阅读 · 0 评论 -
Java多线程[4]:线程间通信
有这么几个方法,它们就定义在大家都非常熟悉的Object类中,但是大家却从来没有调用过,并且也不知道是做什么的,今天就由我带着你们熟悉一下下面的这三个方法。它们都是定义在Object类中的final方法,并且只能在synchronized上下文中调用。 - wait()方法使当前线程进入休眠,直到另一个线程进入同一个监视器并调用nofity()方法。 - nofity() 方法唤醒同一监视器内调用wait()原创 2015-09-30 21:42:44 · 1136 阅读 · 1 评论 -
java多线程[5]:信号量(Semaphore)
Semaphore通过计数器来控制对一个共享资源的访问,它的工作机制是:当一个线程想要访问一个共享资源时,需要向Semaphore申请访问权限,如果Semaphore的计数器大于0,则线程获得共享资源的访问权限,此时Semaphore的计数器减一。当该线程使用完共享资源后,需要释放访问权限,此时Semaphore的计数器加一。如果一个线程在申请访问权限时Semaphore的计数器为0,则当前线程就会原创 2017-12-17 22:25:33 · 980 阅读 · 0 评论 -
java多线程[6]:CountDownLatch
CountDown的意思是倒数,latch的意思是门锁。CountDownLatch大概可以理解为:倒数几个数之后,门就打开了。具体来讲,CountDownLatch的工作机制是:它内部维护了一个倒计时数字,每次调用countDown()方法,这个数字就减一,当这个数字降为0后,门就开了。当一个线程调用它的await()方法时,如果门没开(倒计时数字大于0)的话,则调用await方法的线程会挂起,直原创 2017-12-18 22:31:04 · 297 阅读 · 0 评论 -
java多线程[7]:CyclicBarrier
cyclic的意思是周期,barrier的意思是障碍或栅栏。CyclicBarrier提供了一种很有意思的线程间保持步调一致的方案,它的工作机制是:它在初始化时设置一个周期数量,表示为n,当某个线程都调用了CyclicBarrier对象的await()方法时,当前线程会挂起,直到n个或n的整数倍个线程都调用await()方法时,这个周期完成了,将一次性唤醒所有因调用了await()方法而挂起的线程,原创 2017-12-18 23:14:11 · 275 阅读 · 0 评论 -
java多线程[8]:Exchanger
两个线程可以通过Exchanger来交换数据,从而将自己的状态告诉对方。它是一个泛型类Exchanger<V>,泛型参数表示交换数据的类型。它定义了两个版本的exchange()方法,分别是:V exchange(V objRef) throws InterruptedExceptionV exchange(V objRef, long wait, TimeUnit tu) throws Inte原创 2017-12-19 21:24:21 · 276 阅读 · 0 评论 -
java多线程[9]:线程池(ExecutorService)
java多线程已经写了好几篇了,博客中使用所有demo,线程都是通过Thread类的start()方法启动的,这样的话每次都会创建一个新的线程,创建线程时会耗费一些操作系统的资源,当线程比较多时对性能有较大的影响。为了解决这个问题,java提供了好几种类型的线程池来提高运行时效率。ExecutorService接口绝大部分(如果不是全部的话)的线程池都实现了ExecutorServic原创 2017-12-21 08:53:49 · 1790 阅读 · 0 评论 -
java多线程[10]:Callable和Future
本篇要讨论的是Callable接口和Future接口。想要创建一个线程的话,除了实现Runnable接口外,还可以实现Callable接口,这样的话,在线程运行结束后可以返回一个运行结果。在上一篇博客中我们讨论了如何使用线程池来启动线程,并对比了几种不同的线程池之间的差异。原创 2017-12-24 20:27:15 · 343 阅读 · 0 评论 -
java多线程[11]:原子操作(atomic)
原子操作指的是一个不可分割的操作,例如,读取是原子的,写入是原子的,但读取后加一再写入就不是原子的。多线程环境下,就有可能出现多个线程同时读取并修改一个公共资源的情况,如果[读取并修改]不是原子操作的话,就有可能会导致错误的结果。举例说明:假设多个线程同时操作一个累加器,累加器就是对一个公共字段就行读取后再加一写入,如果两个线程同时读取到的值都是10,加一后又同时写入了11,就会造成结果的偏差,因原创 2017-12-25 21:18:21 · 716 阅读 · 0 评论 -
Java Exception
本文和大家一块讨论Java语言中的异常处理机制。Java异常简介首先,有别于编译错误,异常是运行时错误。也就是说,出现异常的代码,编译是没有问题的,而是运行时出现了意想不到的问题,例如,数组越界,网络连接失败,空指针等。如果出现了这些问题而没有得到处理,程序可能出现中断,闪退或其它不友好的结果。Java异常处理机制简介不过,Java的异常处理机制允许我们通过编码的方式来捕获这些异常。Java异常处理原创 2015-09-30 10:42:15 · 744 阅读 · 0 评论 -
Java枚举
JDK5.0之前,Java是没有枚举的,但随着程序员对枚举的需求越来越强烈,Java也对枚举提供了很好的支持。定义枚举创建枚举需要用enum关键字。下面的代码创建了一个名叫Colors的枚举,包含几个颜色。public enum Colors { Red, Yellow, Blue, Black, White}使用枚举//声明枚举对象的方式Colors c原创 2015-10-06 10:00:24 · 960 阅读 · 0 评论 -
Java中的泛型
泛型(Generic)在jdk1.5被引入,它加入了一个全新的语法元素,并且好多类和方法都重新实现了泛型的版本,受之影响最大的就是Collections Framework了。本篇博客来讨论一下泛型的语法特征,并简要地讨论一下底层的实现机制。泛型类原创 2017-12-01 21:42:38 · 370 阅读 · 0 评论 -
java中的反射
反射使java有了分析自己的能力,可以通过反射机制知道一个类包含哪些内容(字段,属性,方法等),还可以调用他们。反射比较经常用于java bean,例如,我在配置文件中定义了一个类的完整名字,并定义了一个方法名,我希望应用程序启动时创建一个该类的对象,并调用它的该方法。本篇博客的内容都会基于下面的这个类来操作public class A { public String msg; pub原创 2017-12-17 15:21:44 · 331 阅读 · 0 评论 -
java中的lambda表达式
lambda表达式在jdk1.8中被加入进来,给古老的java语言注入了新鲜的活力。先说句题外话,我看了一些早期spark(大数据计算框架)的书,当时spark支持scala,java和python,其中,spark的很多api(如map,flatmap,filter等)在scala和python中都可以使用lambda表达式轻松搞定,很简洁,无奈的java使用匿名内部类,冗长的包名,复杂的嵌套,原创 2017-12-05 07:52:55 · 1067 阅读 · 1 评论 -
java stream api
stream api是jdk1.8中引入的,位于java.util.stream中,它基于lambda表达式,扩展了集合操作的能力。stream api比较类似apache spark的api,以及.net框架中的Linq。之所以说它扩展了集合操作的能力,是因为它的所有操作都是在一个数据集合中进行的,尽管在java中没有集成到Collection框架中,但是在其它语言中,这种操作确实跟集合或数原创 2017-12-07 22:54:50 · 897 阅读 · 0 评论 -
java中使用正则表达式
正则表达式在处理字符串时非常有用,本篇博客来讨论一下java中正则表达式的用法。在java.util.regex包下面有两个类,分别是Pattern和Matcher,前者表示一个正则表达式的模式,后者用来表示pattern与某个字符串的匹配信息。Pattern类本身没有定义构造方法,可以通过Pattern.compile()静态方法来生成一个Patte原创 2017-12-08 21:07:39 · 10179 阅读 · 0 评论 -
java编写一个计算器
本篇博客来用java编写一个计算器,来计算一个算数表达式,这个表达式支持加减乘除和任意层次的括号嵌套(仅支持圆括号)。思路设计首先讨论一下思路。假设有一个算数表达式为(2 + 1) + 200 * 3.2 / (5 * (2 + 6 )),我们首先需要按照优先级先计算最内层括号内的表达式,然后再计算外层括号的,直到演化为一个不含括号的普通加减乘除表达式,最终得出一个结果。代码设计:...原创 2017-12-10 22:47:37 · 6730 阅读 · 1 评论 -
intelliJ IDEA动态加载静态资源文件(intelliJ IDEA live load)
最近在做一些前端开发的工作(前端工程师跑路了),后台是springboot,前后端在一个git仓库中。在开发的过程中我遇到一个很讨厌的问题,使用intelliJ idea启动springboot项目,修改静态资源(如html,css,js等)的内容后,刷新浏览器没有反应,需要重启springboot项目才行,这肯定是会影响开发效率的。其实idea是支持动态加载资源文件的,只是默认没有开启,执行...原创 2018-07-31 18:41:36 · 9647 阅读 · 0 评论 -
jvm classloader
本篇博客来(不深不浅地)讨论一下jvm中的classloader。classloader的父级委派模型jvm在实例化一个对象之前(通过new关键字或者反射),会先把这个类load到jvm中。在jvm中,不同的类是由不同的classloader来载入的,jvm官方推荐的方式是父级委派模型(parent delegation model)。有人翻译为双亲委派模型,由于我对双亲的第一反映...原创 2018-06-28 19:15:20 · 433 阅读 · 0 评论 -
java内存模型(JMM)与volatile
java内存模型jvm为了屏蔽掉各种硬件和操作系统之间的内存访问差异,定义了java内存模型。java内存模型主要是定义了主内存(Main Memory)和工作内存(Working Memory)各自的职责:主内存直接对应物理硬件的内存。为了获得更快的性能,工作内存可能会优先使用寄存器和高速缓存。主内存是共享的,每个线程都有自己的工作内存。不同线程的工作内存是私有的,不能相互访问。...原创 2018-07-11 23:41:11 · 279 阅读 · 0 评论