摘要: public class Test { private int queueSize = 10; private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize); private Lock lock = new 阅读全文
posted @ 2022-07-14 15:44 烟笼寒山 阅读(22) 评论(0) 推荐(0)
摘要: public class Test { private int queueSize = 10; private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize); public static void main( 阅读全文
posted @ 2022-07-14 15:39 烟笼寒山 阅读(28) 评论(0) 推荐(0)
摘要: Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使 阅读全文
posted @ 2022-07-14 15:34 烟笼寒山 阅读(632) 评论(0) 推荐(0)
摘要: 调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;这一点与notify()方法是不同的。notifyAll()方法只是唤醒等待该对象的monitor的线程,并不决定哪个线程能够获取到monitor。举个简单的例子:假如有三个线程Thread1、Thread2和Thre 阅读全文
posted @ 2022-07-14 15:26 烟笼寒山 阅读(319) 评论(0) 推荐(0)
摘要: 调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程; notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程 阅读全文
posted @ 2022-07-14 15:25 烟笼寒山 阅读(1390) 评论(0) 推荐(0)
摘要: wait()、notify()和notifyAll()是Object类中的方法: /** * Wakes up a single thread that is waiting on this object's * monitor. If any threads are waiting on this 阅读全文
posted @ 2022-07-14 15:18 烟笼寒山 阅读(34) 评论(0) 推荐(0)
摘要: interrupt()方法 interrupt,顾名思义,即中断的意思。单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,也就说,它可以用来中断一个正处于阻塞状态的线程;另外,通过interrupt方法和isInterrupted()方法来停止正在运行的线程。 下面看一个例子:p 阅读全文
posted @ 2022-07-14 15:15 烟笼寒山 阅读(454) 评论(0) 推荐(0)
摘要: join()方法join方法有三个重载版本:join()join(long millis) //参数为毫秒join(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒假如在main线程中,调用thread.join(有参数)方法,则main方法会等待thr 阅读全文
posted @ 2022-07-14 15:10 烟笼寒山 阅读(312) 评论(0) 推荐(0)
摘要: sleep()方法sleep()方法有两个重载版本:sleep(long millis) //参数为毫秒sleep(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒 sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。但是有一点要非常注意, 阅读全文
posted @ 2022-07-14 14:58 烟笼寒山 阅读(848) 评论(0) 推荐(0)
摘要: 线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、睡眠或等待一定的时间(time waiting(sleep))、等待被唤醒(waiting)、消亡(dead)。 创建(new): 当 阅读全文
posted @ 2022-07-14 14:37 烟笼寒山 阅读(62) 评论(0) 推荐(0)
摘要: 公共数据接口,FutureData和RealData都要实现。public interface Data { //获取线程结果 public abstract String getRequest();} FutureData,当有线程想要获取RealData的时候,程序会被阻塞。等到RealData 阅读全文
posted @ 2022-07-14 11:10 烟笼寒山 阅读(56) 评论(0) 推荐(0)
摘要: synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况: 1)获 阅读全文
posted @ 2022-07-14 10:43 烟笼寒山 阅读(59) 评论(0) 推荐(0)
摘要: ReentrantReadWriteLock里面提供了很多丰富的方法,不过最主要的有两个方法:readLock()和writeLock()用来获取读锁和写锁。 下面通过几个例子来看一下ReentrantReadWriteLock具体用法。假如有多个线程要同时进行读操作的话,先看一下synchroni 阅读全文
posted @ 2022-07-14 10:40 烟笼寒山 阅读(26) 评论(0) 推荐(0)
摘要: ReadWriteLock也是一个接口,在它里面只定义了两个方法:public interface ReadWriteLock { /** * Returns the lock used for reading. * * @return the lock used for reading. */ L 阅读全文
posted @ 2022-07-14 10:37 烟笼寒山 阅读(37) 评论(0) 推荐(0)
摘要: lockInterruptibly()方法:比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就使说,当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B 阅读全文
posted @ 2022-07-14 10:35 烟笼寒山 阅读(480) 评论(0) 推荐(0)
摘要: tryLock()方法:是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。 tryLock(long time, TimeUnit unit)方法:和tryLoc 阅读全文
posted @ 2022-07-14 10:29 烟笼寒山 阅读(2021) 评论(0) 推荐(1)
摘要: lock()方法:是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,则进行等待。由于在前面讲到如果采用Lock,必须主动去释放锁,并且在发生异常时,不会自动释放锁。因此一般来说,使用Lock必须在try{}catch{}块中进行,并且将释放锁的操作放在finally块中进行,以保证 阅读全文
posted @ 2022-07-14 10:27 烟笼寒山 阅读(700) 评论(0) 推荐(0)
摘要: 所在包:java.util.concurrent.locks Lock是一个接口:public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); 阅读全文
posted @ 2022-07-14 10:21 烟笼寒山 阅读(95) 评论(0) 推荐(0)
摘要: synchronized代码块类似于以下这种形式:synchronized(synObject) { }当在某个线程中执行这段代码块,该线程会获取对象synObject的锁,从而使得其他线程无法同时访问该代码块。synObject可以是this,代表获取当前对象的锁,也可以是类中的一个属性,代表获取 阅读全文
posted @ 2022-07-14 10:12 烟笼寒山 阅读(2852) 评论(0) 推荐(0)
摘要: 算法原理: (1)与锁相比,使用比较交换(下文简称CAS)会使程序看起来更加复杂一些。但由于其非阻塞性,它对死锁问题天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小。更为重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销,因此,它要比基于锁的方式拥有更优越的 阅读全文
posted @ 2022-07-14 10:05 烟笼寒山 阅读(254) 评论(0) 推荐(0)