- 浏览: 1589837 次
- 来自: 上海
文章分类
- 全部博客 (374)
- Java (101)
- Struts (54)
- Oracle (30)
- JavaScript (16)
- Spring (27)
- Hibernate (16)
- MyEclipse (3)
- JSF (1)
- FreeMarker (2)
- SiteMesh (2)
- JfreeChart (2)
- Ibatis (2)
- JSP (12)
- MyBatis (4)
- SWFupload (1)
- EJB (4)
- Jboss (4)
- WebService (2)
- Linux (16)
- Android (2)
- XML (6)
- Java 网络编程 (13)
- AXIS2 (1)
- FTP (1)
- Jswing (1)
- Socket (3)
- 杂文选集 (6)
- solr (2)
- PS (1)
- Tomcat (7)
- JDBC (9)
- Highcharts (1)
- maven (1)
- Nodejs (0)
- navicat (2)
- Exception (5)
- eclipse (3)
- jQuery (1)
- springMVC (4)
- MySQL (11)
- SVN (1)
- Sql Server (1)
- zookeeper (1)
- JVM (1)
- Groovy (2)
- Git (1)
- Nginx (1)
- DynamicReport (1)
- IDEA (2)
- JasperReports (1)
- Postgresql (2)
- Mac (1)
- gradle (1)
- 数据结构算法 (1)
最新评论
-
hpu145:
引用引用
java 千分位的添加和去除 -
被遗忘的下路:
少了个junit-4.8.2的包
SSH2整合完整案例(四十三) -
白天看黑夜:
java过滤emoji字符处理,希望能帮到你http://ww ...
emoji 表情图片解决方法 -
caipeiming:
这个挺好JavaScript实现input输入框控件只允许输入 ...
js 控制文本框只能输入中文、英文、数字等 -
双子树:
东西太好啦受教啊
Struts2 JSP中将list,set ,Map传递到Action然后<s:iterator>遍历(三十五)
// lock 练习 public class LockTest{ public static void main(String[] args) { // TODO Auto-generated method stub new LockTest().init(); } private void init(){ final Outputer out=new Outputer(); new Thread( new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.output4("English"); } } } ).start(); new Thread( new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.output4("Chinese"); } } } ).start(); } //使用各种 同步锁对象 this,.class ,Object ,Lock static class Outputer{ Lock lock=new ReentrantLock(); public void output4(String name){ int len=name.length(); lock.lock(); //使用 jdk 1.5 提供的锁 try { for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } catch (Exception e) { // TODO: handle exception }finally{ lock.unlock(); } } } }
//condition
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** *父子线程 交替打印10 次, 100次 * @author Bin */ public class ConditionCommunication { static boolean isSubRun=true; /** * @param args */ public static void main(String[] args) { /*new Thread( new Runnable() { @Override public void run() { int num=0; synchronized (TraditionalThreadCommunication.class) { while (num<=4) { if(!isSubRun){ try { TraditionalThreadCommunication.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+" run "+i); } isSubRun=false; TraditionalThreadCommunication.class.notify(); num++; } } } } ).start(); new Thread( new Runnable(){ @Override public void run() { int num=0; while(num<=4){ synchronized (TraditionalThreadCommunication.class) { if(isSubRun){ try { TraditionalThreadCommunication.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName()+" run "+i); } isSubRun=true; TraditionalThreadCommunication.class.notify(); num++; } } } } ).start();*/ final Business bus=new ConditionCommunication().new Business(); new Thread(){ @Override public void run() { for (int i = 1; i < 5; i++) { bus.sub(i); } } }.start(); new Thread(new Runnable(){ @Override public void run() { for (int i = 1; i < 5; i++) { bus.main(i); } } }).start(); } class Business{ Lock lock=new ReentrantLock(); Condition condition=lock.newCondition(); private boolean sShouldSub=true; public void sub(int i){ //synchronzied 有 lock 替代 lock.lock(); try { if(!sShouldSub){ //这里换成 while try { //this.wait(); condition.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 10; j++) { System.out.println("Sub thread sequence of "+j+" loop of"+i); } sShouldSub=false; //this.notify(); condition.signal(); } finally{ lock.unlock(); } } public void main(int i){ lock.lock(); try { while(sShouldSub){//这里换成while 比 if 更 安全 健壮 try { //this.wait(); condition.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 0; j < 100; j++) { System.out.println("Main thread sequence of "+j+" loop of"+i); } sShouldSub=true; //this.notify(); condition.signal(); } finally{ lock.unlock(); } } } }
发表评论
-
检测一个字符串是否在jvm的常量池中
2018-12-18 17:34 997public static boolean inPool( ... -
UTC时间, GMT时间 ,夏令时
2017-08-18 15:12 2281经常混淆于此,特地研究了一下,记录在此以备忘。 整个地 ... -
java 反射List
2017-02-18 01:58 5654package com.enhance.reflect; ... -
JDK1.5 Exchange 两个线程互换数据
2016-08-04 18:00 986import java.util.concurrent ... -
JDK1.5 CountDownLatch
2016-08-04 16:25 1055/* * 还有一个利用场景: ... -
java CyclicBarrier 循环障碍阻塞
2016-08-03 23:54 1008//一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ... -
java 信号灯 Semaphore
2016-08-03 23:53 1823更多介绍http://blog.csdn.net/java20 ... -
java 使用读写锁设计一个缓存模型
2016-08-03 23:49 1416import java.util.HashMap; ... -
java 读写锁
2016-08-03 23:46 814import java.util.Random; i ... -
java 多个线程之间同步通信
2016-08-02 17:16 2396import java.util.concurrent ... -
JDK1.5 获取线程执行结果 Callable Future
2016-08-02 15:08 1172import java.util.Random; i ... -
JDK1.5 线程池
2016-08-02 14:48 801import java.util.concurrent ... -
java 多线程ThreadLocal
2016-08-02 00:13 1145import java.util.Random; ... -
java 定时器 Timer
2016-08-01 16:53 3892import java.util.Calendar; ... -
java 多线程同步+通信
2016-08-01 16:48 964/** *父子线程 交替打印10 次, 100次 ... -
java 线程同步
2016-08-01 16:43 1021import java.util.concurrent.l ... -
java多线程练习
2016-08-01 16:35 1840Java 传统多线程 Java 多线程同步 Java 多线 ... -
java 传统多线程
2016-08-01 16:34 1004/** * 传统多线程 */ public ... -
java 图片,剪切,缩放
2016-01-06 10:21 2230package out; import ja ... -
java术语(PO/POJO/VO/BO/DAO/DTO)
2014-11-27 11:45 1986PO(persistant object) 持久 ...
相关推荐
在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`接口,这些工具大大提升了生产者消费者模式的实现效率和线程安全性。 生产者消费者模式...
在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁管理机制。 1. **Lock类** - Lock是一个接口,其主要实现类有ReentrantLock(可重入锁)。ReentrantLock不仅具备了...
与synchronized不同,ReentrantLock支持公平锁和非公平锁策略,并且可以分离条件变量,这使得多路分支等待成为可能。 - Condition接口提供了等待/通知机制,允许更精确的线程同步。每个Lock实例可以有多个Condition...
本文将基于JDK源码解析Java领域中的并发锁,探讨AQS基础同步器、LockSupport、Condition接口、Lock接口、ReadWriteLock接口以及自定义API操作的设计与实现。 一、AQS(AbstractQueuedSynchronizer)基础同步器的...
`ReentrantLock`则提供了更灵活的锁定机制,包括公平锁和非公平锁,以及尝试获取锁、定时获取锁和可中断获取锁等功能。 死锁的四个必要条件是:互斥条件、占有并等待、无剥夺和循环等待。当这四个条件都满足时,就...
书中会介绍Thread类和Runnable接口,线程同步机制如synchronized关键字、wait/notify、Lock和Condition,以及线程池的使用。 6. **网络编程**:Java的Socket编程允许创建基于TCP/IP的客户端和服务端应用程序,书...
在Java中,从JDK 1.5版本开始,引入了java.util.concurrent.locks.Condition接口,它与java.util.concurrent.locks.Lock接口一起使用,提供了一种灵活的条件变量实现。 首先,我们来理解Lock接口。Lock接口提供了一...
显式锁则是JDK 1.5引入的,提供了更加灵活和强大的同步机制。 内置锁的使用非常方便,不需要显式的获取和释放,任何一个对象都能作为一把内置锁。内置锁的使用可以解决大部分的同步场景。但是,内置锁也存在一些...
AQS是Java中解决同步和互斥问题的基础同步器,通过Lock和Condition两个接口来实现管程。Lock用于解决互斥问题,Condition用于解决同步问题。AQS的设计和实现是基于管程技术的,管程是解决同步和互斥问题的有效方法。...
在Java8中,Lock和Condition可以实现线程同步,ReentrantLock可以实现可重入锁,Condition可以实现线程之间的通信。下面是一个示例代码: ```java class ShareData2 { private int number = 0; private Lock lock...
以上示例展示了如何使用ReentrantLock和Condition实现生产者消费者模式,其中涉及了锁的基本使用方法以及Condition的信号传递机制。 #### 五、总结 并发编程是现代软件开发中不可或缺的一部分,正确理解和使用锁...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
Java提供了多种机制来实现这一点,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及JDK 1.5之后引入的`Lock`和`Condition`接口。`ThreadLocal`类则允许在线程范围内创建独立的数据副本,实现...
Java中的ReentrantLock是线程安全编程中的一种高级锁机制,它属于Lock接口的一个实现,提供了比synchronized更丰富的功能和更高的灵活性。ReentrantLock的名字来源于它的可重入性,这意味着一个线程可以多次获取同一...
通过实例,读者可以学习如何创建和管理线程,理解线程同步和通信的概念,如synchronized关键字、wait()和notify()方法,以及Lock接口和Condition类的使用。 5. **网络编程**:Java的Socket编程允许开发者创建网络...
3. **多线程**:Java 6对多线程的支持非常完善,Thread类和Runnable接口是实现并发的基础,还包括Synchronized关键字、Lock接口和Condition等高级并发工具。 4. **网络编程**:Socket和ServerSocket类提供了TCP/IP...
3. `Lock`和`Condition`:从Java 5开始引入,提供了更细粒度的控制,比如可重入锁(`ReentrantLock`)和条件(`Condition`),可以实现更灵活的线程同步。 在Eclipse3.3和MyEclipse6这样的开发环境中,可以方便地调试和...
例如,在JDK 1.5中引入了新的并发API,并在后续版本中持续改进和优化了这些并发工具,使得Java并发编程变得更加简便和安全。 总之,Java多线程编程极大地增强了程序处理并发任务的能力,但是在享受多线程带来的好处...