jdk1.5 锁 Lock 和 Condition
程序员文章站
2022-05-28 18:24:15
...
// 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(); } } } }
上一篇: java 多线程同步+通信
下一篇: java 定时器 Timer
推荐阅读
-
售票情景解读synchronized和Lock两种锁的区别
-
线程高级篇-Lock锁和Condition条件
-
semaphore(信号量), event(事件), lock/mutex(锁), condition的区别
-
Java:使用synchronized和Lock对象获取对象锁
-
Java:使用synchronized和Lock对象获取对象锁
-
Java 开发中的Lock锁和Synchronized详解
-
狂神--线程停止,加入,礼让,等待及synchronized锁和lock锁
-
售票情景解读synchronized和Lock两种锁的区别
-
MySQL的快照读(MVCC)和当前读(行锁、间隙锁、Next-Key Lock)解决幻读
-
关于自治事务和锁PRAGMAAUTONOMOUS_TRANSACTION&LOCK