`
文章列表
大话设计模式<二>
大话设计模式<->
Oracle提供两种验证方式,一种是OS验证,另一种密码文件验证方式 第一种方式的修改 1、控制面板->管理工具->服务 中打开    OracleOraHome92TNSListener服务    和OracleServiceORACLE(ORACLE可能在具体的系统中名称不一样,他与你装Oracle时指定的名称有关)服务 2、打开命令行,在命令行中输入: sqlplus "/ as sysdba" 注意:以上的引号是必不可少的    *上指示的ORACLE就是服务名即OracleService后面的部分 3、在SQL>后面输入: alter us ...
AOP概念 首先让我们从定义一些重要的AOP概念开始。这些术语不是Spring特有的。 不幸的是,AOP术语并不是特别的直观;如果Spring使用自己的术语,将会变得更加令人困惑。 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。 连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 ...

Spring

    博客分类:
  • JAVA
http://www.iteye.com/topic/353208 http://www.iteye.com/topic/281611 http://test.52crack.com/media/nb.mp3 http://www.blogjava.net/beansoft/archive/2009/06/22/283519.html
JAVA 多线程文章系列[枫叶 KR 整理] 精通LINUX&UNIX Shell程序设计.pdf
思考 java的synchronized提供了最底层的物理锁,要在synchronized的基础上,实现自己的逻辑锁,就必须仔细设计ReadWriteLock。 Q: lock.readLock()为什么不放入try{ } 内? A: 因为readLock()会抛出InterruptedException,导致readingThreads++不执行,而readUnlock()在finally{ } 中,导致readingThreads--执行,从而使readingThread状态出错。writeLock()也是类似的。 Q: preferWrite有用吗? A: 如果去掉preferWri ...
我们启动了5个读线程和2个写线程,运行结果如下: Thread-0 waiting for read... Thread-1 waiting for read... Thread-2 waiting for read... Thread-3 waiting for read... Thread-4 waiting for read... Thread-5 waiting for write... Thread-6 waiting for write... Thread-4 reads data: AAAAAAAAAA Thread-3 reads data: AAAAAAAAAA Thread ...
readLock()用于获得读锁,readUnlock()释放读锁,writeLock()和writeUnlock()一样。由于锁用完必须释放,因此,必须保证lock和unlock匹配。我们修改DataHandler,加入ReadWriteLock: package com.crackj2ee.thread; public class DataHandler {     // store data:     private char[] buffer = "AAAAAAAAAA".toCharArray();     // lock:     private ReadWri ...
线程读写同一个对象的数据是很普遍的,通常,要避免读写冲突,必须保证任何时候仅有一个线程在写入,有线程正在读取的时候,写入操作就必须等待。简单说,就是要避免“写-写”冲突和“读-写”冲突。但是同时读是允许的,因为“读-读”不冲突,而且很安全。 要实现以上的ReadWriteLock,简单的使用synchronized就不行,我们必须自己设计一个ReadWriteLock类,在读之前,必须先获得“读锁”,写之前,必须先获得“写锁”。举例说明: DataHandler对象保存了一个可读写的char[]数组: package com.crackj2ee.thread; public class ...
最后,Main负责完成main()方法: package com.crackj2ee.thread; public class Main {     public static void main(String[] args) {         TaskQueue queue = new TaskQueue();         ThreadPool pool = new ThreadPool(queue);         for(int i=0; i<10; i++) {             queue.putTask(new CalculateTask());         ...
最后,Main负责完成main()方法: package com.crackj2ee.thread; public class Main {     public static void main(String[] args) {         TaskQueue queue = new TaskQueue();         ThreadPool pool = new ThreadPool(queue);         for(int i=0; i<10; i++) {             queue.putTask(new CalculateTask());         ...
终于到了真正的WorkerThread,这是真正执行任务的服务器线程: package com.crackj2ee.thread; public class WorkerThread extends Thread {     private static int count = 0;     private boolean busy = false;     private boolean stop = false;     private TaskQueue queue;     public WorkerThread(ThreadGroup group, TaskQueue queue) ...
前面谈了多线程应用程序能极大地改善用户相应。例如对于一个Web应用程序,每当一个用户请求服务器连接时,服务器就可以启动一个新线程为用户服务。 然而,创建和销毁线程本身就有一定的开销,如果频繁创建和销毁线程,CPU和内存开销就不可忽略,垃圾收集器还必须负担更多的工作。因此,线程池就是为了避免频繁创建和销毁线程。 每当服务器接受了一个新的请求后,服务器就从线程池中挑选一个等待的线程并执行请求处理。处理完毕后,线程并不结束,而是转为阻塞状态再次被放入线程池中。这样就避免了频繁创建和销毁线程。 Worker Pattern实现了类似线程池的功能。首先定义Task接口: package com.c ...
服务器线程在红色部分可能会阻塞,也就是说,Queue.getRequest是一个阻塞方法。这和java标准库的许多IO方法类似。 最后,写一个Main来启动他们: package com.crackj2ee.thread; public class Main {     public static void main(String[] args) {         Queue queue = new Queue();         ServerThread server = new ServerThread(queue);         server.start();        ...
Global site tag (gtag.js) - Google Analytics