随笔分类 - Java
摘要:饿汉式 提前new出来实例了,并不是在第一次调用get方法时才实例化,没有进行延迟加载 懒汉式——非线程安全版本 多线程环境下无法保证单例效果,会多次执行 instance=new Singleton(),需要考虑到多线程 懒汉式——同步代码块版 性能不高,同步范围太大,在实例化instacne后,
阅读全文
摘要:Spring Boot内置了tomcat容器,直接运行Application就可以启动web服务器。 在tomcat中提供了三种方式:BIO、NIO、APR。 BIO tomcat7以下的版本都是BIO,就是一个请求是一个独立的线程。不能适用高并发的场景。 NIO 在8以上的版本,默认都是NIO A
阅读全文
摘要:今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务。最后运维大神各种倒腾内存,GC稳定后,服务正常。虽说全程在打酱油,但是也跟着学习不少的东西。 第一个问题:为什么会频繁GC 有过JVM经验的开发者都应该知道,GC是在内存不够时,JVM自动进行的自我救赎(删除不用
阅读全文
摘要:在阅读ZooKeeper的源码时,看到这么一个片段,在单机模式启动的时候,会调用下面的方法,根据zoo.cfg的配置启动单机版本的服务器: 其中比较有意思的两个地方: 1 CountDownLatch的使用 开启NIO新线程接收客户端的请求,服务端的主线程直接利用countdownlatch挂起。这
阅读全文
摘要:在Java里面有几种可以用于控制线程状态的方法,如CountDownLatch计数器、CyclicBarrier循环栅栏、Sempahore信号量。下面就分别演示下他们的使用方法: CountDownLatch CountDownLatch可以实现多线程之间的计数器,并实现阻塞功能。比如某个任务依赖
阅读全文
摘要:前面介绍了基本的网络模型以及IO与NIO,那么有了NIO来开发非阻塞服务器,大家就满足了吗?有了技术支持,就回去追求效率,因此就产生了很多NIO的框架对NIO进行封装——这就是大名鼎鼎的Netty。 前几篇的内容,可以参考: 1. "网络IO的基本知识与概念" 2. "普通IO以及BIO服务器" 3
阅读全文
摘要:前面一篇中已经介绍了基本IO的使用以及最简单的阻塞服务器的例子,本篇就来介绍下NIO的相关内容,前面的分享可以参考目录: 1. "网络IO的基本知识与概念" 2. "普通IO以及BIO服务器" 3. "NIO的使用与服务器Hello world" 4. "Netty的使用与服务器Hello worl
阅读全文
摘要:今天来复习一下基础IO,也就是最普通的IO。 1. "网络IO的基本知识与概念" 2. "普通IO以及BIO服务器" 3. "NIO的使用与服务器Hello world" 4. "Netty的使用与服务器Hello world" 输入流与输出流 Java的输入流和输出流,按照输入输出的单元不同,又可
阅读全文
摘要:Java的网络编程如果不是专门搞服务器性能开发或者消息分发,几乎可能涉及不到。但是它却是面试找工作必问的一个知识点,涵盖的知识体系也非常广泛,从Java底层IO原理到操作系统内核组成,再到网络TCP、UDP、HTTP的应用实践....因此,即便是职场多年的老油条,仍然需要时刻复习,更别提我这种只有七
阅读全文
摘要:最近有一个小项目需求,需要用spring mvc + mybatis实现一个复杂的配置系统。其中遇到了很多不太常见的问题,在这里特意记录下: 主要涉及的内容有 事务 多表删除 插入并返回主键 1 spring mvc + mybatis的事务 背景 大概就是有ABC三张表,A表跟B表是一对多关系,B
阅读全文
摘要:公司是采用微服务来做模块化的,各个模块之间采用dubbo通信。好处就不用提了,省略了之前模块间复杂的http访问。不过也遇到一些问题: PS: "Github的代码示例" 测试需要配合写消费者的代码 对于开发来说,倒是挺省劲。但是对于测试来说就有点麻烦了, 每次还要去写dubbo的消费程序,而且每次
阅读全文
摘要:最近在spark streaming本地调试的时候,引入了一些资源文件,打包的时候需要给排除掉。所以就考虑使用maven的方式 详细参考官方文档:https://maven.apache.org/plugins/maven jar plugin/examples/include exclude.ht
阅读全文
摘要:线程是计算程序运行的最小载体,由于单个单核CPU的硬件水平发展到了一定的瓶颈期,因此就出现了多核多CPU的情况,直接就导致程序员多线程编程的复杂。由此可见线程对于高性能开发的重要性。 那么线程在计算机中有好几种状态,他们之间是怎么切换的?sleep和wait又有什么区别?notify和notifyA
阅读全文
摘要:众所周知,volatile关键字可以让线程的修改立刻通知其他的线程,从而达到数据一致的作用。那么它具体涉及到哪些内容呢? 关于缓存 计算机最大的存储空间就是磁盘(硬盘),但是访问的速度也是最慢的,价格最便宜;再就是内存,容量更小,造价更高,但是速度也更快。不过跟cpu的计算速度比起来,那就太慢了。可
阅读全文
摘要:最早接触到ThreadLocal是在阅读dianping的Cat client,当时对它不是很理解,就搜索了一下,大概了解是一种解决线程安全问题的机制。现在再次阅读《实战java高并发程序设计》时,又重新对它有了更深一步的了解。 并发程序很重要的主题就是解决多线程安全的问题,最常见的处理办法就是引入
阅读全文
摘要:列表对于日常开发来说实在是太常见了,以至于很多开发者习惯性的用到数组,就来一个ArrayList,根本不做过多的思考。其实列表里面还是有很多玩法的,有时候玩不好,搞出来bug还得定位半天。所以这里就再啰嗦一下,整理下相关的内容。 基础知识 一般计算机相关的专业都应该学过数据结构,而很多的集合都是应用
阅读全文
摘要:再次回顾这些基础内容,发现自己理解的又多了一点。对于一些之前很模糊的概念,渐渐的清晰起来。 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化。接口仅仅是描述一种方法的规约,即只能通过某几个方法来操作对象,它把内部的实现隐藏到实现类中,自己仅仅关注使用而已。
阅读全文
摘要:其实Java还有很多其他的基础知识,在日常工作技术撕逼中也是经常被讨论的问题。 深克隆与浅克隆 在Java中创建对象有两种方式: 一种是new操作符,它创建了一个新的对象,并把对应的各个字段初始化成默认值; 另一种是用clone方法,基于已有的对象创建一个新的对象,此时会根据原有的对象各个字段赋值给
阅读全文
摘要:equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注。不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码。 equals 是java很基础的一个问题,通常都会跟 来做比较。那么看看下面的问题: 这是因为, 比较的是引用,而equal
阅读全文