J2EE、J2SE、Tomcat
文章平均质量分 69
Joyyiwei
这个作者很懒,什么都没留下…
展开
-
Java-CountDownLatch的小例子
内容:CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个线程或者说等待N个执行步骤,那么可以将N作为参数传入。当我们调用一次CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await会阻塞当前线程直到N为0。用于多个线程时,你只需要将这个Co原创 2015-06-15 21:16:39 · 1347 阅读 · 0 评论 -
利用URLClassLoader加载两个位置的Class
内容:分别位于\myApp\WEB-INF\classes下的类和\webroot下的类,利用URL数组指定多个仓库位置加载。MyClassLoader:public class MyClassLoader { public static final String WEB_ROOT = System.getProperty("user.dir") + File.separat原创 2015-05-14 22:54:38 · 2194 阅读 · 0 评论 -
Java一个简单的死锁例子
内容:一个简单的死锁例子,大概的思路:两个线程A和B,两把锁X和Y,现在A先拿到锁X,然后sleep()一段时间,我们知道sleep()是不会释放锁资源的。然后如果这段时间线程B拿到锁Y,也sleep()一段时间的话,那么等到两个线程都醒过来的话,那么将互相等待对方释放锁资源而僵持下去,陷入死锁。flag的作用就是让A和B获得不同的锁。public class TestDeadLock {原创 2015-05-16 20:07:53 · 4276 阅读 · 0 评论 -
Java关闭钩子的应用
内容:在很多实际的应用环境中,当用户关闭应用程序时,需要做一些善后清理工作。但问题是,用户有时并不会按照推荐的方法关闭程序,很多可能不做清理工作。关闭钩子是一种解决方案,确保无论用户如果关闭应用程序,清理代码总能够得到执行。我们通过向Runtime类注册关闭钩子:是一个已初始化但尚未启动的线程。虚拟机开始启用其关闭序列时,它会以某种未指定的顺序启动所有已注册的关闭钩子,并让它们同时运行。pub原创 2015-05-16 11:35:01 · 1203 阅读 · 0 评论 -
Java线程(七):Callable和Future
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行转载 2015-05-02 11:06:29 · 412 阅读 · 0 评论 -
Java利用Callable、Future进行并行计算求和
内容:在Java中利用Callable进行带返回结果的线程计算,利用Future表示异步计算的结果,分别计算不同范围的Long求和,类似的思想还能够借鉴到需要大量计算的地方。public class Sums { public static class Sum implements Callable { private final Long from; private fi原创 2015-05-16 00:18:16 · 3318 阅读 · 0 评论 -
Java并发编程之ConcurrentHashMap
ConcurrentHashMapConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。ConcurrentHas转载 2015-05-05 21:15:21 · 408 阅读 · 0 评论 -
Spring核心学习-AOP(7) 织入和代理
前导:开始学习Spring核心思想,通过一个山寨精简版Spring代码结合学习。AdvisedSupport - 保存AOP配置TargetSource - 保存被代理的数据AopProxy - 对代理对象做代理,在调用目标方法前先调用它.JdkDynamicAopProxy - 使用JDK动态代理对接口做代理Re原创 2015-05-12 13:48:36 · 1071 阅读 · 0 评论 -
利用FileChannel完成文件的读、写、复制
内容:通过NIO中的FileChannel完成文件的读、写、复制。public class NioFileCopy { private RandomAccessFile aFile = null; private FileChannel inChannel = null; private final ByteBuffer buf = ByteBuffer.allocate(1024);原创 2015-05-05 13:49:02 · 9478 阅读 · 1 评论 -
监视器–JAVA同步基本概念
原文链接 作者:X Wang 译者:candy大学有一门课程叫操作系统,学习过的同学应该都记得,监视器是操作系统实现同步的重要基础概念,同样它也用在JAVA的线程同步中,这篇文章用一种类推的思想解释监视器”monitor”。1.什么是监视器监视器可以看做是经过特殊布置的建筑,这个建筑有一个特殊的房间,该房间通常包含一些数据和代码,但是一次只能一个消费者(thread转载 2015-05-01 19:13:35 · 1310 阅读 · 0 评论 -
利用NIO的Selector处理服务器-客户端模型
内容:这是一个简单的服务器-客户端模型,利用了NIO的Selector来处理多个管道。至于Selector的介绍看这里NIOServer:public class NIOServer { public static void main(String[] args) throws IOException, InterruptedException { Selector select原创 2015-05-04 23:49:47 · 1545 阅读 · 0 评论 -
利用ObjectInputStream、ObjectOutputStream序列化多个对象
内容:序列化多个对象,利用一个容器存储你要序列化的多个对象。class Student implements java.io.Serializable{ private String name; public Student(String name) { this.name = name; } public String getName() { return na原创 2015-05-15 15:18:55 · 3390 阅读 · 0 评论 -
Java通过锁的顺序避免死锁
内容:通过获取锁的顺序来避免死锁。例如:银行账户转账问题,两个用户转账的话,如果采用一般的synchronized嵌套的话,容易造成死锁,现在我们通过类似哲学家问题的解决方案一样:先获取同一个锁,才有资格获取下一个。而判断是通过System.identityHashCode()来生成类的hashcode()的返回值作为唯一标识,相同的话,我们再加一把锁。class Account { pri原创 2015-05-26 19:51:12 · 3731 阅读 · 0 评论 -
Java-CyclicBarrier的简单例子
内容:一个主任务等待两个子任务,通过CyclicBarrier的await()实现,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。public class CyclicBarrierTest { class MainTask implements Runnable { @Override public void run() {原创 2015-07-11 15:57:39 · 1904 阅读 · 0 评论 -
并发编程实践五:ReentrantLock
ReentrantLock是一个可重入的互斥锁,实现了接口Lock,和synchronized相比,它们提供了相同的功能,但ReentrantLock使用更灵活,功能更强大,也更复杂。这篇文章将为你介绍ReentrantLock,以及它的实现机制。ReentrantLock介绍通常,ReentrantLock按下面的方式使用:[java] view plainc转载 2015-06-13 09:19:01 · 525 阅读 · 0 评论 -
Java-ThreadLocal的简单例子
内容:ThreadLocal:允许我们创建只能被同一个线程读写的变量,例如Web应用中将变量从前端到后台,并且需要在这次请求的线程中始终可以随时获取到。内部实现是通过一个ThreadLocalMap这个Map结构来实现的,将线程对象作为Key,变量副本作为Value。public class TestThreadLocal { public static class MyRunnable1原创 2015-06-02 22:53:25 · 3465 阅读 · 1 评论 -
Java-ReentrantReadWriteLock的简单例子
内容:读锁时共享的,写锁时互斥的(可见运行结果),都是通过AQS实现的。public class ReentrantReadWriteLockTest { static class MyObject { private Object object; private ReadWriteLock lock = new ReentrantReadWriteLock(); pu原创 2015-07-07 20:42:41 · 2245 阅读 · 2 评论 -
Java简单的UDP通讯例子
内容:简单的UDP通讯例子。Receiver:public class Receiver { public static void main(String[] args) { DatagramSocket ds = null; try { //UDP接收端 ds = new DatagramSocket(8080); //定义将UDP的数据包接收到什么地原创 2015-05-19 11:32:51 · 3705 阅读 · 0 评论 -
Java-Fork/Join的简单例子
内容:借助网上的解释:第一步分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小。第二步执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。public class原创 2015-06-02 00:09:30 · 5178 阅读 · 7 评论 -
java不同类加载器对instanceof关键字运算的影响
内容:对于任意的一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类空间。只要加载类的类加载器不同的话,那么这个两个类就必定不相等(包括equals()方法,instanceof()方法)。一个简单的例子说明:注意getResourceAsStream的应用:Class.getResourceAsStream(String pat原创 2015-05-18 15:54:30 · 3212 阅读 · 4 评论 -
Java-LockSupport的小例子
内容:结合一篇博文和自己写的简单例子学习,当然还可以看文档public class TestLockSupport { public static class MyRunnable implements Runnable { private final Thread currentThread; public MyRunnable(Thread thread) {原创 2015-05-31 23:02:23 · 1308 阅读 · 0 评论 -
AbstractQueuedSynchronizer的介绍和原理分析
简介提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础。使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似acquire和release的方式来操纵状态。然而多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握,需要使用这个同转载 2015-05-29 14:35:40 · 1232 阅读 · 0 评论 -
Java用读-写锁来包装Map
内容:利用ReentrantReadWriteLock来包装Map,从而使它能在多个读线程之间被安全分享,并且仍然能避免“读-写”或“写-写”冲突。记住重要的一点是:读-写锁实现的加锁策略中,允许多个读操作同时进行,但每次只允许一个写操作。public class ReadWriteMap { private final Map map; private final ReadWriteLo原创 2015-05-28 00:19:37 · 2977 阅读 · 1 评论 -
Java NIO与IO
原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html作者:Jakob Jenkov 译者:郭蕾 校对:方腾飞当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代转载 2015-05-03 15:48:23 · 428 阅读 · 0 评论 -
Spring核心学习(2)管理Bean的生命周期
前导:开始学习Spring核心思想,通过一个山寨精简版Spriing代码结合学习。内容:1. 抽象BeanFactory-面向接口更易拓展原创 2015-05-09 14:00:12 · 780 阅读 · 0 评论 -
《深入剖析Tomcat 》第4章 tomcat的默认连接器
4.1 简介第三章的连接器只是一个学习版,是为了介绍tomcat的默认连接器而写。第四章会深入讨论下tomcat的默认连接器(这里指的是tomcat4的默认连接器,现在该连接器已经不推荐使用,而是被Coyote取代)。 tomcat的连接器是一个独立的模块,可被插入到servlet容器中。目前已经有很多连接器的实现,包括Coyote,mod_jk,mod_jk2,转载 2015-04-27 15:59:42 · 862 阅读 · 0 评论 -
Java 理论与实践: 用动态代理进行修饰(可以借鉴到spring的学习)
来源:IBM developerworks简介: 动态代理工具 是 java.lang.reflect 包的一部分,在 JDK 1.3 版本中添加到 JDK,它允许程序创建 代理对象,代理对象能实现一个或多个已知接口,并用反射代替内置的虚方法分派,编程地分派对接口方法的调用。这个过程允许实现“截取”方法调用,重新路由它们或者动态地添加功能。本中 Brian Goetz 介绍了几个用于动态代转载 2015-02-24 10:36:56 · 515 阅读 · 0 评论 -
Web服务器的工作原理
原文Web服务器工作原理概述很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它们是怎样处理来自全世界的http请求的?它们在幕后做了什么动作?Java Servlet API(例如ServletContext,ServletRequest,ServletResponse和Session这些类)在其中扮演了什么角色?这些都转载 2015-02-19 20:01:30 · 604 阅读 · 0 评论 -
JAVA编程思想(5) - 接口(一)
接口接口和内部类为我们提供了一种将接口和实现分离的更加结构化的方法抽象类和抽象方法在之前“乐器”的所有例子中,基类Instrument中的方法往往是“哑”的方法,若要调用这些方法的话,就会出现一些错误。。这是因为Instrument类的目的是为它的所有的导出类创建一个通用接口。在那些例子中,建立这个通用接口的唯一理由是,不同的子类可以用不同的方式表示此接口。通用接口建立起一原创 2014-09-11 15:25:54 · 1349 阅读 · 0 评论 -
JAVA编程思想(3) - 复用类(二)
组合和继承之间选择组合和继承都允许在新的类中放置子对象,组合是显示地这么做的,而继承是隐式地做。组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情况。在新类中我们只能看到的是为新类所定义的接口,而非所嵌入对象的接口。为取得这个效果,需要在新类中嵌入一个现有类的private对象。有时,允许类的用户直接访问新类中组合成分是极据意义的,声明为public(一般情况下是private)原创 2014-08-23 21:29:15 · 874 阅读 · 0 评论 -
JAVA编程思想(4) - 多态(三)
若干个对象共享例如Frog对象拥有其自己的对象,并且知道他们的存活多久,因为Frog对象知道何时调用dispose()去释放其对象。然而,如果这些成员对象中存在于其他一个或多个对象共享的情况,问题将不再简单,不再能简单的调用dispose()了。在这种情况下,我们也许需要引用计数来跟踪依旧访问着共享对象的数量。//: polymorphism/ReferenceCounting.jav原创 2014-09-07 00:27:06 · 1892 阅读 · 0 评论 -
JAVA编程思想(2) - 操作符(一)
"在最第"原创 2014-07-18 21:46:18 · 1055 阅读 · 0 评论 -
java 反射机制:运行时的类信息(为框架服务的Bug存在)
反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。换一种引出反射的说法是:当通过反射与一个未知的类型的对象打交道是,JVM只是简单地检查这个类,看它是属于哪个特定的类(就想RTTI那样)。在用它做其他事情之前必须先加载那个类的Cl原创 2015-02-24 21:04:34 · 1215 阅读 · 0 评论 -
一个简单的java聊天室
利用java Socket编写的群聊室,可以自己拷过去试试Server端:package net3;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Ser原创 2015-03-19 11:20:17 · 24649 阅读 · 1 评论 -
《深入剖析Tomcat 》第3章 连接器(Connector)
第3章 连接器(Connector)3.1 概述在简介一章里说明了,tomcat由两大模块组成:连接器(connector)和容器(container)。本章将使用连接器来增强application 2的功能。一个支持servlet2.3和2.4规范的连接器必须要负责创建javax.servlet.http.HttpServletRequest和javax.servlet.ht转载 2015-04-27 14:58:30 · 833 阅读 · 0 评论 -
深入剖析Tomcat-第二章:一个简单的servlet容器(1)
内容:在上一章的基础上多了对servlet的处理,重点是ServletProcessor1这个类,利用到了URL、URLClassLoader和java反射机制。webroot:public class HttpServer1 { private static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; private boolean sh原创 2015-04-25 11:19:07 · 838 阅读 · 0 评论 -
深入剖析Tomcat-第二章:一个简单的servlet容器(2)
内容:在上一篇中存在一些安全问题,因为我们需要将request和response想上转型为ServletRequest和ServletResponse,了解这个servlet容器内部工作原理的servlet程序员可以将ServletRequest和ServletResponse分别向下转型然后就能调用Request和Response的parse()和sendStaticResource()了。所以原创 2015-04-25 15:38:06 · 720 阅读 · 0 评论 -
吐司BlockingQueue
有一台机器具有三个任务:一个制作吐司、一个给吐司摸黄油、另一个在抹过黄油的吐司上涂果酱。我们可以通过各个处理过程之间的BlockingQueue来运行这个吐司制作程序。也就说我们可以利用三个阻塞队列LinkedBlockingQueue,一个任务完成后就把这个Toast放到下一个队列中,维护三个队列就能做到了。class Toast { public enum Status {DRY, BU原创 2015-04-21 23:43:18 · 756 阅读 · 0 评论 -
深入剖析Tomcat-第一章
--开始学习Tomcat服务器,学习代码,自己注释一下。import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.ServerSocket;i原创 2015-04-24 20:17:42 · 1059 阅读 · 1 评论 -
任务间使用管道进行输入输出
内容:通过输入/输出在线程间进行通信通常很有用。利用PipedWriter类(允许任务向管道写)和PipedReader类(允许不同任务从同一个管道中读取)。下面代码中Sender和Receiver代表了需要相互通信的两个任务。Sender把数据放进Writer,然后休眠一段时间。然而,Receiver没有sleep()和wait()。但当他调用read()时,如果没有更多的数据,管道将阻塞,而普原创 2015-04-23 22:38:37 · 754 阅读 · 0 评论