- 浏览: 1381028 次
- 性别:
- 来自: 江西
文章分类
- 全部博客 (287)
- oracle (30)
- Java (73)
- MySQL (16)
- Myeclipse/eclipse (12)
- javascript (15)
- JSP/Servlet (7)
- maven (14)
- AJAX (2)
- JQuery (9)
- tomcat (8)
- spring (21)
- Linux (28)
- PHP (9)
- UI (1)
- 编程错误及处理 (38)
- 多线程 (18)
- hibernate (10)
- Web Service (3)
- struts2 (6)
- log4j (3)
- SVN (4)
- DWR (1)
- lucene (1)
- 正则表达式 (4)
- jstl (2)
- SSL (3)
- POI (1)
- 网络编程 (1)
- 算法 (2)
- xml (4)
- 加密解密 (1)
- IO (7)
- jetty (2)
- 存储过程 (1)
- SQL Server (1)
- MongoDB (1)
- mybatis (1)
- ETL (1)
- Zookeeper (1)
- Hadoop (5)
- Redis (1)
- spring cloud (1)
最新评论
-
ron.luo:
牛逼,正解!
maven设定项目编码 -
lichaoqun:
java.sql.SQLException: Can't call commit when autocommit=true -
Xujian0000abcd:
Thanks...
Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the clas -
renyuan2ni:
[i][b][u]引用[list]
[*][img][flas ...
Manual close is not allowed over a Spring managed SqlSession -
851228082:
宋建勇 写道851228082 写道<!-- 文件拷贝时 ...
maven设定项目编码
package cn.com.songjy.test.socket.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * * ClassName:ConditionCommunication * jdk1.5条件阻塞Condition的应用(通信) * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次 * * @author songjy * @version 1.0 * @since v1.0 * @Date 2013-8-22 下午2:22:53 */ public class ConditionCommunication { public static void main(String[] args) { final Businese businese = new Businese(); new Thread(new Runnable() { public void run() { for (int j = 0; j < 50; j++) { businese.sub(j); } } }).start(); for (int j = 0; j < 50; j++) { businese.main(j); } } static class Businese { private static Log log = LogFactory.getLog(Businese.class); private boolean sub = true; private Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public /*synchronized*/ void sub(int j) {/*synchronized被Lock代替*/ lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (!sub) {// 还没有轮到我(sub),继续等待(睡觉) try { //wait(); condition.await();/*代替wait(),但切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 10; i++) { log.info("sup thread sequence of" + i + "loop of " + j); } sub = false;// 执行完毕,变更状态 //notify();// 本次执行完毕,唤醒其他线程(main) condition.signal();/*代替notify()*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//最终必须释放锁,即使程序出错! } } public /*synchronized*/ void main(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (sub) {// 还没有轮到我(main),继续等待(睡觉) try { //wait(); condition.await();/*代替wait(),但切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 100; i++) { log.info("main thread sequence of" + i + "loop of " + j); } sub = true;// 执行完毕,变更状态 //notify();// 本次执行完毕,唤醒其他线程(sub) condition.signal();/*代替notify()*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//即使程序出错也必须释放锁 } } } } /*备注:wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承、且不允许重写的方法*/
package cn.com.songjy.test.socket.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * * ClassName:ConditionCommunication * jdk1.5条件阻塞Condition的应用(通信) * 子线程1循环5次,接着子线程2循环10次,最后主线程循环15次,接着又回到子线程1循环5次,接着子线程2循环10次,最后主线程循环15次,如此循环10次 * * @author songjy * @version 1.0 * @since v1.0 * @Date 2013-8-22 下午2:22:53 */ public class ThreeConditionCommunication { public static void main(String[] args) { final Businese businese = new Businese(); new Thread(new Runnable() { public void run() { for (int j = 0; j < 10; j++) { businese.sub1(j); } } }).start(); new Thread(new Runnable() { public void run() { for (int j = 0; j < 10; j++) { businese.sub2(j); } } }).start(); for (int j = 0; j < 10; j++) { businese.main(j); } } static class Businese { private static Log log = LogFactory.getLog(Businese.class); private int sub = 0; private Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); public void sub1(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (0 != sub) {// 还没有轮到我(sub1),继续等待(睡觉) try { condition1.await();/*切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 5; i++) { log.info("sup1 thread sequence of" + i + "loop of " + j); } sub = 1;// 执行完毕,变更状态 condition2.signal();/*唤醒sub2线程*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//最终必须释放锁,即使程序出错! } } public void sub2(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (1 != sub) {// 还没有轮到我(sub2),继续等待(睡觉) try { condition2.await();/*切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 10; i++) { log.info("sup2 thread sequence of" + i + "loop of " + j); } sub = 2;// 执行完毕,变更状态 condition3.signal();/*唤醒main线程*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//最终必须释放锁,即使程序出错! } } public void main(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (2 != sub) {// 还没有轮到我(main),继续等待(睡觉) try { //wait(); condition3.await();/*切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 15; i++) { log.info("main thread sequence of" + i + "loop of " + j); } sub = 0;// 执行完毕,变更状态 condition1.signal();/*唤醒sub1线程*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//即使程序出错也必须释放锁 } } } } /*备注:wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承、且不允许重写的方法*/
package cn.com.songjy.test.socket.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * ClassName:BoundedBuffer * 缓冲模拟(不是缓存) * * @author songjy * @version 1.0 * @since v1.0 * @Date 2013-8-23 上午9:40:18 */ class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); return x; } finally { lock.unlock(); } } }
来自:http://down.51cto.com/data/443438
发表评论
-
java.io.NotSerializableException: java.util.ArrayList$SubList
2016-03-15 11:36 2867错误信息: 原代码: if (null != dto ... -
java.lang.NoSuchMethodError
2015-10-30 19:50 1265在执行命令 java -Djava.ext.dirs=./de ... -
OutOfMemoryError
2015-01-07 10:49 679错误信息: 执行命令(修改前): java -Djava. ... -
自定义ClassLoader
2014-12-14 17:13 888一、自定义类加载器代码: package foo; im ... -
ExecutorService.shutdown()应该是在线程执行完毕后,才会去关闭
2014-04-29 13:03 19581看到一个博客,如下 Jav ... -
URL传递中文参数乱码问题
2014-03-14 12:55 1155项目特殊要求,form表单使用get方式提交,由此出现了中文乱 ... -
Java使用正则进行奇偶替换
2013-12-30 11:20 1594/** * 将位于偶数位的数字1替换为2 */ ... -
Java调用ping命令
2013-11-26 10:26 3716package cn.com.songjy; impor ... -
Linux开机启动Java程序
2013-11-25 15:26 3591一、编写启动Java程序shell脚本(smssend.sh) ... -
单例模式
2013-11-05 09:58 793Java之美[从菜鸟到高手演变]之设计模式 Java开发中 ... -
判定2个对象相等之重写equals方法
2013-10-18 11:03 1100package cn.com.songjy.test; ... -
SAX解析XML文件示例
2013-09-13 17:32 1047package cn.com.songjy.test.xml; ... -
二分查找算法(Binary Search)
2013-09-13 17:01 2467项目中遇到需要从数组中查找数据,但是算法很多,于是根据项目需求 ... -
Iterate over rows and cells(EXCEL文件的读取)
2013-09-13 14:13 4101package cn.com.songjy.test.exce ... -
jdk1.5的Exchanger同步工具
2013-08-27 14:04 703package cn.com.songjy.test.sock ... -
jdk1.5的CountDownLatch同步工具
2013-08-27 13:37 816package cn.com.songjy.test.sock ... -
jdk1.5的Semaphere同步工具
2013-08-23 14:20 1094package cn.com.songjy.test.so ... -
jdk1.5读写锁技术的妙用
2013-08-19 22:00 1396/** * ReadWriteLockTest.java ... -
jdk1.5的线程锁技术
2013-08-19 20:25 967/** * LockTest.java * cn.co ... -
Callable与Future的应用
2013-08-19 20:03 1073/** * CallableAndFuture.java ...
相关推荐
相比`synchronized`,`Lock`提供了更多的功能,比如可重入性、尝试获取锁(非阻塞)、可中断的锁等待以及条件变量(`Condition`)等。`Condition`允许我们创建多个独立的等待队列,这样可以更灵活地控制线程间的通信...
JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,它包含了编译、调试、运行Java程序所需的各种工具和库。JDK 1.4.2 是Java历史上的一个重要版本,发布于2004年,它引入了许多...
在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁管理机制。 1. **Lock类** - Lock是一个接口,其主要实现类有ReentrantLock(可重入锁)。ReentrantLock不仅具备了...
总结来说,Java多线程与并发库的高级应用,既包括了传统的多线程编程技术,也包含了JDK 1.5之后引入的高级并发工具和特性。掌握这些知识点对于任何想要在Java编程领域深入发展的开发者来说,都是非常必要的。
Condition接口提供了比synchronized更细粒度的线程间通信机制,它允许线程等待特定条件,而不仅仅是等待锁的释放。当线程调用condition的await()方法时,会释放当前持有的锁,进入等待状态,直到其他线程调用signal...
Java提供了多种机制来实现这一点,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及JDK 1.5之后引入的`Lock`和`Condition`接口。`ThreadLocal`类则允许在线程范围内创建独立的数据副本,实现...
ReentrantLock不仅具备synchronized的互斥性,还支持条件条件(Condition),通过newCondition()可以创建多个条件,每个条件对应一组等待线程,可以精确控制线程的唤醒。 线程的生命周期包括新建、就绪、运行、阻塞...
JDK 1.5引入了更多的同步工具类,如线程池`ExecutorService`,它允许更有效地管理线程,避免频繁创建和销毁线程带来的开销。`Callable`和`Future`接口提供了获取线程执行结果的能力,而`Future`的`get()`方法可以...
Java5条件阻塞Condition的应用 - `Condition`接口提供了比`wait()`和`notify()`更强大的条件等待/唤醒机制。 ##### 14. Java5的Semaphere同步工具 - `Semaphore`是一种计数信号量,可以控制多个线程对共享资源的...
线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 ...
2.2.2 Waiting on condition的线程可能在等待条件变量(如`java.util.concurrent.locks.Condition`)的变化。 2.2.3 等待监控器入口(Waiting for monitor entry)和在`Object.wait()`中的线程表示存在资源争用,...
7. **使用Condition**:`ReentrantLock`的`Condition`接口可以更好地控制线程间的协作,避免死锁。 回到我们的示例代码`DoorOpen.java`,很可能是演示了如何正确使用门锁以及解决死锁问题的实例。可能包含了模拟两...
例如,在JDK 1.5中引入了新的并发API,并在后续版本中持续改进和优化了这些并发工具,使得Java并发编程变得更加简便和安全。 总之,Java多线程编程极大地增强了程序处理并发任务的能力,但是在享受多线程带来的好处...
- 支持条件变量(Condition),这使得线程可以在等待特定条件满足时释放锁,条件满足后再重新获得锁继续执行。 ##### 2.3 阻塞队列 阻塞队列(`BlockingQueue`)是一种特殊的队列,当队列为空时,从队列中获取元素...
在并发环境下,为了保证线程安全,ArrayBlockingQueue采用了ReentrantLock(可重入锁)来实现同步,并且在某些关键操作中使用了Condition(条件变量)来实现等待/通知机制。 1. 初始化:ArrayBlockingQueue在创建时...
`Condition` 是与 `ReentrantLock` 配合使用的条件对象,可以替代传统的 `wait()` 和 `notify()` 方法实现更加灵活的线程间通信。 - **AtomicInteger、ConcurrentHashMap、ArrayBlockingQueue**:这些类是 Java 并...
JDK 提供的几种阻塞队列实现: 1. ArrayBlockingQueue:基于数组的有界阻塞队列,线程安全,遵循先进先出(FIFO)原则,可以通过构造函数设置容量。 2. LinkedBlockingQueue:基于链表的有界阻塞队列,默认无大小...
- **同步机制**:synchronized关键字、Lock锁(如ReentrantLock)、信号量Semaphore、条件变量Condition等。 - **线程状态**:新建、就绪、运行、阻塞、死亡。 4. **反射**: - 反射API:Class类、Constructor类...
Condition的等待和唤醒操作比Object的wait/notify更安全,因为它们只能在已获取锁的上下文中执行,减少了死锁和竞态条件的风险。 ReentrantLock的这些特性使得它在某些复杂的并发场景下更为适用,例如,当需要精确...