
java
song_suo
程序员
展开
-
线程池
线程池是并发包里的东西。有个Executors工厂类,可以直接搞到我们常用的几个线程池对象,前提是对原理比较理解,才可以放心大胆的使用。java之前有个Timer类,当定时器使。现在线程池也提供类类似的功能,有了这个,完全可以不用使用那个Timer类了。上一段代码public static void main(String[] args) { ScheduledExecutorSer原创 2017-04-06 22:51:57 · 306 阅读 · 0 评论 -
java Queue接口简介
Queue继承自Collection接口,所以支持add,remove操作。但是不建议使用,Queue接口提供了offer,poll和peek方法来替代。offer表示添加,poll表示移除,peek表示查看但不移除。Collection的add等方法在失败时会抛出异常,但是offer等方法在失败时不会抛异常,会在返回值中表现出来。比如offer,成功返回true,失败返回false。poll原创 2017-03-17 18:02:13 · 1372 阅读 · 0 评论 -
常见的并发设计模式
Future模式 并发的精髓应该是不等待,但是有些请求可能处理时间会比较长,必须等待。此时就做一个折中,就是服务端立马把请求返回,不让客户端等待结果,返回的是一个假结果,可能客户端这个时候也不着急,得到结果后就去做别的事了,服务端会接着去处理请求,处理完毕后,会通知客户端(回调)。这个时候客户端才会拿到真正想要的结果。Master-Worker模式 一种典型的分治思想,Master-Worker原创 2017-04-06 18:47:32 · 629 阅读 · 0 评论 -
001--java类的热替换
自定义类加载器需要继承ClassLoader类,调用loadClass(String className)方法来加载类。执行loadClass方法,就是单纯的把类加载到内存,并不是对类的主动使用(主动使用分6种情况),不会引起类的初始化。父委托机制的好处或者为什么要用父委托机制?是为了安全,在这种机制下,用户自定义的类加载器不可能加载应该由父类加载器加载的可靠类。从而防止由父类加载的可靠代码被原创 2017-03-15 13:53:41 · 593 阅读 · 0 评论 -
004--jar包中类的加载顺序(类名冲突)
javac是用来编译*.java文件的。如果 .java文件中有import引入的类,那么在编译的时候,也需要这些类,否则报错。 javac -cp a.jar;b.jar; xxxx.java 在windows下,多个jar包用分号隔开。如果a.jar与b.jar都有类com.A。那么执行 java -cp a.jar;b.jar;./ XXX时,哪个jar包在前面,就加载哪个jar包原创 2017-03-16 11:12:51 · 2626 阅读 · 0 评论 -
002--java获取指定包下面的类名称
java的java.util.jar包下面的工具类可以实现。代码如下/** * 获取指定包下的类名称 * * @param jarPath * @param packageName * @return * @throws Exception */ public List<String> getClassNamesUnder原创 2017-03-15 22:36:19 · 389 阅读 · 0 评论 -
单例模式的正确打开方式
public class SingleFactory { private static class Single{ private static Single single = new Single(); } public Single getInstance(){ return Single.single; }}这是一种懒汉式单例,原创 2017-04-05 15:16:57 · 282 阅读 · 0 评论 -
java中的位运算
常用的位运算有<<,>>,>>><< : 左移运算符,num << 1,相当于num乘以2 : 右移运算符,num >> 1,相当于num除以2 : 无符号右移,忽略符号位,空位都以0补齐 对于正数来说,>>与>>>效果是一样的。这程序中运用位运算,能提高程序的运行效率。原创 2017-03-16 12:12:13 · 256 阅读 · 0 评论 -
java找出字符串中的汉字
java中的字符编码是unicode,有的人说java中的char类型占用2个字节,这个说法是不准确的。比如汉字,确实是占用了2个字节,但是对于英文字母,其实是占用了一个字节。这样做的目的是为了节省内存空间。因为在java的诞生地美国,都是用英文来书写的。 String str = "你好,hello world,我好,大家good"; String regex = "原创 2017-03-17 16:45:26 · 3564 阅读 · 0 评论 -
用wait和notify模拟阻塞队列
public class MyBlockedQueue { private int[] array; private int head; private int last; private int size; public MyBlockedQueue(int maxSize) { this.head = 0; this.last原创 2017-04-05 14:37:54 · 535 阅读 · 0 评论 -
java NIO简介
java NIO的底层基础是IO多路复用技术。所谓多路复用,就是把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统多线程模型比,IO多路复用的最大优势就是系统开销小,系统不需要创建新的额外的线程,也不需要维护这些线程,降低了系统的维护工作量,节省了系统资源。IO多路复用的主要应用场景如下:1,服务器需要同时处理多个处于监转载 2017-04-04 19:00:40 · 343 阅读 · 0 评论 -
同步与异步,阻塞与非阻塞
先上一个来自网络的例子老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~转载 2017-04-04 17:35:45 · 186 阅读 · 0 评论 -
一种公平锁的java实现
利用队列来实现公平锁public class Lock { private Queue<String> intrestedQueue = new ArrayDeque<String>();//感兴趣的线程队列 private volatile String turn;//轮到哪个线程执行 public void lock() { Thread currentTh原创 2017-03-29 19:18:06 · 824 阅读 · 0 评论 -
Java volatile关键字原理
因为cpu运行速度非常快,为了提高cpu跟内存之间的数据传输速度,一般的cpu都会用到高速缓存,在适当的时刻(需要编程,cpu是很傻的),cpu将数据从物理内存读入高速缓存,当cpu真正需要读取数据时,直接从高速缓存中读,这样速度就变得非常快。通过以上的描述,cpu在很多情况下是不从物理内存中直接读数的,而是从高速缓存中读取。cpu运算结束后,结果也会保存在高速缓存,并在一个适当的时间将数据回写到物原创 2017-03-30 22:48:43 · 241 阅读 · 0 评论 -
http协议动词举例(转载)
对于资源的具体操作类型,由HTTP动词表示。常用的HTTP动词有下面五个(括号里是对应的SQL命令)。GET(SELECT):从服务器取出资源(一项或多项)。POST(CREATE):在服务器新建一个资源。PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。DELETE(DE转载 2017-03-31 11:28:45 · 1919 阅读 · 0 评论 -
java 并发线程个数的确定
本文从控制变量的角度来谈决定线程个数的依据。模型很简单,在实际的生产环境中,情况肯定比下文要复杂的多。要充分的进行测试,以使线程个数为优。 java应用程序大概分为两种:cpu密集型和io密集型。cpu密集型: 就是指线程大部分时间都在用cpu,一般来说,普通的操作都需要用到cpu,比如计算,读取,循环,赋值,查询,排序等等。在最理想的情况下,大牛们建议将线程数设置为count(cpu)+-1原创 2017-03-31 14:14:11 · 4560 阅读 · 0 评论 -
java web如何估算平均每个请求占用内存大小(转)
eden空间的大小我们是知道的,通常一个请求分配的空间都在eden区域,eden区域满的时候会发生Young GC.所以有了GC的时间间隔,比如2s,进一步通过QPS数量*2就知道了多少此请求把内存沾满。然后一除就获得了答案当然,这也是估算值,并不是那么准,很多时候会有许多不可预见的情况发生,例如Young GC的条件并不一定等价于Eden区被填满,只是我们认为其他情况发生的概率不高,就可以做一个估转载 2017-03-31 14:35:24 · 2947 阅读 · 0 评论 -
JVM参数设置、分析(转)
原博客地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具转载 2017-04-10 14:36:41 · 249 阅读 · 0 评论 -
硬盘原理(转)
身为java程序员,知道一点硬件的知识,是没有什么坏处的。现在的磁盘大部分为机械硬盘,是靠磁盘的旋转来读取/写入数据。衡量机械硬盘的标准为iops(每秒进行io的次数),对于SATA硬盘来说,iops大概是60,严重拖了计算机的后腿。SAS硬盘要好一些,是120,不过价格也更贵一些。下面介绍几个概念iops:磁盘每秒最多可以完成的io次数。这个io大家不要理解为转载 2017-03-31 15:26:58 · 357 阅读 · 0 评论 -
缓存小结
缓存用于读多写少的场景,数据中有大量的读,少量的写。这是一个比例,通常的比例是十几倍甚至几十倍,这时就会用缓存的优势来降低数据库的压力。还有就是缓存的命中率问题,因为缓存的引入,增加了系统的复杂性,如果命中率不高的话,返回会使访问数据库变的更慢(因为每次请求都要先访问缓存)。还有就是非常火的分布式缓存,大多数都是用的“非强制一致性”,在分布式环境下,由于网络延迟,很少有架构转载 2017-03-31 17:50:38 · 288 阅读 · 0 评论 -
java模拟高并发
public class ConcurrentTest { private static int threadCount = 10; public static void main(String[] args) { final CountDownLatch countDownLatch = new CountDownLatch(threadCount); fo原创 2018-02-11 11:28:53 · 2022 阅读 · 0 评论