Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁)

Lock与synchronized的区别

  Lock锁可以人为的释放锁(相当于汽车中的手动挡)

  synchronized当线程执行完毕或者抛出异常的话,锁自动释放(相当于汽车中的自动挡)

Condition用法

  Condition的功能类似于在传统的线程技术中的Object.wait()和Object.notify()的功能

package com.cppdy;

import java.util.concurrent.locks.Condition;
//JDK1.5之后出现的并发包
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class User1 { public String username;
public String sex;
// 如果flag为false 证明变量可写不可读
// 如果flag为true 证明变量可读不可写
public boolean flag = false; public Lock lock = new ReentrantLock(); } class InputThread1 extends Thread {
private User1 user;
private Condition condition; public InputThread1(User1 user,Condition condition) {
this.user = user;
this.condition=condition;
} @Override
public void run() {
int count = 0;
while (true) {
user.lock.lock();
try {
if (user.flag) {
condition.await();
}
if (count % 2 == 0) {
user.username = "cppdy";
user.sex = "nan";
} else {
user.username = "吹泡泡的魚";
user.sex = "男";
}
count++;
// 将user标记变为可读
user.flag = true;
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
user.lock.unlock();
}
}
}
} class OutThread1 extends Thread {
private User1 user;
private Condition condition; public OutThread1(User1 user,Condition condition) {
this.user = user;
this.condition=condition;
} @Override
public void run() {
while (true) {
user.lock.lock();
try {
if (!user.flag) {
condition.await();
}
System.out.println(user.username + "--" + user.sex);
// 将user标记变为可写
user.flag = false;
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
user.lock.unlock();
}
}
}
} public class ThreadDemo14 { public static void main(String[] args) throws Exception {
User1 user = new User1();
Condition condition=user.lock.newCondition();
InputThread1 it = new InputThread1(user,condition);
OutThread1 ot = new OutThread1(user,condition);
it.start();
ot.start();
} }

java多线程快速入门(十八)的更多相关文章

  1. java多线程快速入门(八)

    设置线程优先级:join() package com.cppdy; class MyThreadA extends Thread{ MyThreadB b; public MyThreadA(MyTh ...

  2. java 多线程 快速入门

    ------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...

  3. java多线程快速入门(二十二)

    线程池的好处: 避免我们过多的去new线程,new是占资源的(GC主要堆内存) 提高效率 避免浪费资源 提高响应速度 作用:会把之前执行某个线程完毕的线程不会释放掉会留到线程池中给下一个调用的线程直接 ...

  4. java多线程快速入门(二十)

    1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...

  5. java多线程快速入门(十五)

    使用violate关键字解决了变量的可见性问题(volatile让多线程刷新falg的值) package com.cppdy; class MyThread11 extends Thread { / ...

  6. java多线程快速入门(十四)

    使用atomicInteger解决了原子性问题(AtomicInteger保证每次只能一个线程操作count) package com.cppdy; import java.util.concurre ...

  7. java多线程快速入门(十九)

    如何停止线程 1.使用stop方法强行终止线程(这个方法不推荐使用,可能会出现业务操作未执行完,线程中断了) package com.cppdy; class MyThread15 extends T ...

  8. java多线程快速入门(十六)

    ThreadLocal关键字实现每个线程有自己的变量 package com.cppdy; class Number { private int num; public static ThreadLo ...

  9. java多线程快速入门(十二)

    在静态方法上面加synchonizd用的是字节码文件锁 package com.cppdy; class MyThread8 implements Runnable { private static ...

随机推荐

  1. Socket与TCP,UDP

    什么是socket 简单来说是IP地址与端口的结合协议(RFC 793) 一种地址与端口的结合描述协议 TCP/IP协议的 相关API的总称:是网络api的集合实现 涵盖了:Stream Socket ...

  2. Luogu P3700「CQOI2017」小Q的表格

    为什么我连分块都想不到啊... 题意 定义一个矩阵$f$满足 $ f(a,b)=f(b,a)$ $ b·f(a,a+b)=(a+b)·f(a,b)$ 初始$ f(a,b)=ab$ 有$ m$次修改,每 ...

  3. python 数据分析3

    本节概要 pandas简介 安装 pip install pandas pandas的2个主要数据结构:DataFrame 和 Series Series series是一种类似于一维数组的对象,它由 ...

  4. Tip: JSP开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. JSP+JavaBean模式适合开发业务 ...

  5. Spring的aop操作

    1 在spring里面进行aop操作,使用aspectj实现(1)aspectj不是spring一部分,和spring一起使用进行aop操作(2)Spring2.0以后新增了对AspectJ支持2 使 ...

  6. linux 文件搜索命令

  7. ClassNotFoundException和NoClassDeFoundError

    ClassNotFoundException:反射时(类加载时)类名写错了(属于可捕获的异常) NoClassDeFoundError:编译时依赖的类(jar包)在运行环境机器中不存在(属于无法处理的 ...

  8. 【Math for ML】解析几何(Analytic Geometry)

    I. 范数(Norm) 定义: 向量空间\(V\)上的范数(norm)是如下函数: \[ \begin{align} \|·\|:V→R, \notag \\ x→\|x\| \notag \end{ ...

  9. poi读取Excel模板并修改模板内容与动态的增加行

    有时候我们可能遇到相当复杂的excel,比如表头的合并等操作,一种简单的方式就是直接代码合并(浪费时间),另一种就是写好模板,动态的向模板中增加行和修改指定单元格数据. 1.一个简单的根据模板shee ...

  10. QR 编码原理(二)

    编码就是把常见的数字.字符等转换成QR码的方法.说具体的编码之前,先说一下QR码的最大容量问题. 一.最大容量 QR码的最大容量取决于选择的版本.纠错级别和编码模式(Mode:数字.字符.多字节字符等 ...