随笔分类 -  JAVA SE

java标准版 java基础
摘要:等待状态(WAITING): 一个处于运行状态的线程还可能调用wait()方法、该方法会使调用的线程释放对象锁释,所以线程将进入等待获取锁的队列里面。join() 方法同理,join()方法底层使用的wait(),只不过Join()方法作用于当前执行的线程中。通过调用notify()或notifyAll()这两个方法来唤醒线程然后进入锁池状态。进入锁池状态以后继续参与锁的竞争。 阅读全文
posted @ 2019-09-03 12:01 小禾点点 阅读(370) 评论(0) 推荐(0) 编辑
摘要:调用通道的close( )方法时,可能会导致在通道关闭底层I/O服务的过程中线程暂时阻塞,哪怕该通道处于非阻塞模式。通道关闭时的阻塞行为(如果有的话)是高度取决于操作系统或者文件系统的。在一个通道上多次调用close( )方法是没有坏处的,但如果第一个线程在close( )方法中阻塞,那么在它完成关闭通道之前,任何其他调用close( )方法都会阻塞。后续在该已关闭的通道上调用close( )不会产生任何操作,只会立即返回。 阅读全文
posted @ 2019-05-13 09:49 小禾点点 阅读(310) 评论(0) 推荐(0) 编辑
摘要:直接在堆外分配一个内存(即,native memory)来存储数据,程序通过JNI直接将数据读/写到堆外内存中。因为数据直接写入到了堆外内存中,所以这种方式就不会再在JVM管控的堆内再分配内存来存储数据了,也就不存在堆内内存和堆外内存数据拷贝的操作了。这样在进行I/O操作时,只需要将这个堆外内存地址传给JNI的I/O的函数就好了。底层的数据其实是维护在操作系统的内存中,而不是jvm里,DirectByteBuffer里维护了一个引用address指向了数据,从而操作数据。实现zero copy(零拷贝) 阅读全文
posted @ 2019-05-13 01:00 小禾点点 阅读(1083) 评论(0) 推荐(0) 编辑
摘要:查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找、插值查找以及斐波那契查找都可以归为一类——插值查找。插值查找和斐波那契查找是在二分查找的基础上的优化查找算法。 阅读全文
posted @ 2017-11-13 17:25 小禾点点 阅读(366) 评论(0) 推荐(0) 编辑
摘要:Compoarator接口的compare方法有两个参数 所以Lambda 表达式为 (Integer o1,Integer o2); {System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));return o1.compareTo(o2);} 是实现该接口覆盖compare方法的具体实现逻辑。所以最终Compoarator接口的最终实现代码用Lambda表达式实现为:(Integer o1,Integer o2)->{ System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2)); return o1.compareTo(o2);} 阅读全文
posted @ 2017-10-12 16:50 小禾点点 阅读(4944) 评论(0) 推荐(2) 编辑
摘要:CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。 阅读全文
posted @ 2017-07-28 08:56 小禾点点 阅读(554) 评论(0) 推荐(0) 编辑
摘要:异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。 阅读全文
posted @ 2017-07-19 20:47 小禾点点 阅读(912) 评论(0) 推荐(0) 编辑
摘要:父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。所以我们在开发中尽量不要使用与JDK相同的类(例如自定义一个java.lang.System类),因为父类加载器中已经有一份java.lang.System类了,它会直接将该类给程序使用,而你自定义的类压根就不会被加载。 阅读全文
posted @ 2017-03-10 16:57 小禾点点 阅读(358) 评论(0) 推荐(2) 编辑
摘要:我们通常会用equals判断集合中是否包含一个对象,这种方式需要遍历集合中每一个元素,然后对他们一一进行equals方法比较。对于少量数据的集合该方式自然可以,但当我们的数据很多例如一万个,如果还使用这种逐个遍历的方式显然不合适。于是有人发明了一种哈希算法来提高从集合中查找元素的效率。这种方式的核心就是将集合分为若干个区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,查找对象时我们先根据对象的哈希码来确定该对象存储在某个区域。然后在这个区域内查找元素。 阅读全文
posted @ 2017-03-09 14:54 小禾点点 阅读(510) 评论(0) 推荐(0) 编辑
摘要:泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。 阅读全文
posted @ 2017-03-08 15:53 小禾点点 阅读(466) 评论(0) 推荐(0) 编辑
摘要:代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 阅读全文
posted @ 2017-03-07 15:21 小禾点点 阅读(401) 评论(0) 推荐(0) 编辑
摘要:在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。 阅读全文
posted @ 2016-11-21 10:08 小禾点点 阅读(1586) 评论(0) 推荐(1) 编辑
摘要:内存操作流(ByteArrayInputStream、ByteArrayOutputStream)、打印流(PrintStream,PrintWriter)、标准输入输出流(public final class System)、合并流 SequenceInputStream、序列化流(ObjectOutputStream)与反序列化流(ObjectInputStream)、随机访问流(RandomAccessFile) 阅读全文
posted @ 2016-11-08 17:44 小禾点点 阅读(616) 评论(0) 推荐(0) 编辑
摘要:字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的。字符流操作的是缓冲区(当我们对文件进行读写操作时如果不调用close() 或 flush()方法时不能看到数据的变化)。字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题。所以在学习Io流的字符流前我们先了解些关于编码问题。 阅读全文
posted @ 2016-11-07 14:05 小禾点点 阅读(10849) 评论(1) 推荐(2) 编辑
摘要:字节流:字节流处理单元为1个字节,操作字节和字节数组,主要处理二进制数据所以字节流可用于处理任何类型的对象。字节流操作的是文件本身(当我们对文件进行读写操作时如果不调用close() 或 flush()方法时能看到数据的变化)。字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream。 阅读全文
posted @ 2016-11-04 13:47 小禾点点 阅读(543) 评论(0) 推荐(1) 编辑
摘要:在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.concurrent.locks.ReentrantLock 锁,JDK也为我们提供了与此功能相应的类java.util.concurrent.locks.Condition。Condition与重入锁是通过lock.newCondition()方法产生一个与当前重入锁绑定的Condtion实例,我们通知该实例来控制线程的等待与通知 阅读全文
posted @ 2016-09-23 10:00 小禾点点 阅读(34331) 评论(5) 推荐(0) 编辑
摘要:独占锁 -- 锁在一个时间点只能被一个线程锁占有。根据锁的获取机制,它又划分为“公平锁”和“非公平锁”。公平锁,是按照通过CLH等待线程按照先来先得的规则,公平的获取锁;而非公平锁,则当线程要获取锁时,它会无视CLH等待队列而直接获取锁。独占锁的典型实例子是ReentrantLock,此外,ReentrantReadWriteLock.WriteLock也是独占锁。 阅读全文
posted @ 2016-09-21 21:57 小禾点点 阅读(3873) 评论(1) 推荐(0) 编辑
摘要:Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问;Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。 阅读全文
posted @ 2016-09-19 23:46 小禾点点 阅读(2734) 评论(1) 推荐(0) 编辑
摘要:设计并发编程的目的是为了使程序获得更高的执行效率,但绝不能出现数据一致性(数据准确)问题,如果并发程序连最基本的执行结果准确性都无法保证,那并发编程就没有任何意义。。如何控制多线程操作共享数据引起的数据准确性问题呢?使用“序列化访问临界资源”的方案,即在同一时刻,只能有一个线程访问临界资源,也称作同步互斥访问,也就是保证我们的共享资源每次只能被一个线程使用,一旦该资源被线程使用,其他线程将不得拥有使用权 阅读全文
posted @ 2016-09-11 19:06 小禾点点 阅读(2763) 评论(3) 推荐(1) 编辑
摘要:当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。 阅读全文
posted @ 2016-09-08 15:15 小禾点点 阅读(2586) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示