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. Coursera, Machine Learning, Unsupervised Learning, K-means, Dimentionality Reduction

    Clustering  K-means: 基本思想是先随机选择要分类数目的点,然后找出距离这些点最近的training data 着色,距离哪个点近就算哪种类型,再对每种分类算出平均值,把中心点移动到 ...

  2. Spark思维导图之Spark Core

  3. VUX调用例子

    首先创建一个vue项目 vue init webpack Vue-Project   <1>. 在项目里安装vuxnpm install vux --save   <2>. 安 ...

  4. MIME 类型

    关于读音 为了防止大家出去丢人,我先示范一下,MIME应该独坐[maim],听起来就好像“男人”的英语法人一样. 浏览器和MIME的关系 浏览器依靠MIME类型解释网页. 每当浏览器请求一个web页面 ...

  5. vmware常用命令

    控制台桌面执行快捷键ctrl+alt+f2 可以进入命令行

  6. openstack Q版部署-----Mysql、MQ、Memcached安装配置(2)

    一.安装mysql(contorller) 安装软件包: yum install -y mariadb mariadb-server python2-PyMySQL 配置my.cnf文件 vi /et ...

  7. Node.js的单元测试框架初体验

    Mocha是一个功能丰富的JavaScript测试框架,运行在node.js平台和浏览器端,使异步测试变得简单和有趣.Mocha测试是串行的,允许灵活和准确的报告,同时将未捕获的异常映射到相应的测试用 ...

  8. 全面接触PDF:最好用的PDF软件汇总(转)

    全面接触PDF:最好用的PDF软件汇总(2010-12-07更新): http://xbeta.info/pdf-software.htm 比较全面的c#帮助类,各种功能性代码: https://gi ...

  9. C++ 解析Json——jsoncpp

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录.Jsoncpp是个跨 ...

  10. Mysql安装与配置调优

    一.安装apt-get install mysql-server 需要设置账号密码 apt-get isntall mysql-client apt-get libmysqlclient-dev2.s ...