synchronized死锁
package com.thread.demo.deadlock;

public class DeadLock {
private static Object lock1 = new Object();
private static Object lock2 = new Object(); public static void main(String[] args) {
// 创建线程1
new Thread(new Runnable() { @Override
public void run() {
while (true) {
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + "获取到lock1这把锁");
System.out.println(Thread.currentThread().getName() + "等待lock2锁..........");
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + "获取到lock2这把锁");
}
}
} }
}, "A线程").start(); // 创建的线程2
new Thread(new Runnable() { @Override
public void run() {
while (true) {
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + "获取到lock2这把锁");
System.out.println(Thread.currentThread().getName() + "等待lock1锁..........");
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + "获取到lock1这把锁");
}
}
} }
}, "B线程").start();
}
}
ReentrantLock死锁
package com.thread.demo.deadlock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class ReentrantDeadLock {
private static Lock lock = new ReentrantLock(); public static void main(String[] args) {
new Thread(new MyRunnable(lock), "一线程").start();
new Thread(new MyRunnable(lock), "二线程").start();
} } class MyRunnable implements Runnable { private Lock lock;
private static int count = 0; public MyRunnable(Lock lock) {
this.lock = lock;
} @Override
public void run() {
lock.lock(); try {
for (int i = 0; i < 100000000; i++) {
count++; if (i == 100000) {
throw new RuntimeException();
}
}
System.out.println(Thread.currentThread().getName() + ":count=" + count);
} catch(Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
} } }

wait,notify,notifyAll 必须结合synchronized关键字使用

package com.thread.demo.cooperation;

/**
* wait,notify,notifyAll 必须结合synchronized关键字使用
*
* @author Administrator
*
*/
public class Demo1 { public static void main(String[] args) {
// 创建共享池
Container container = new Container();
new MyThread(container).start();
new MyThread(container).start();
new MyThread(container).start();
new MyThread1(container).start();
new MyThread1(container).start();
new MyThread1(container).start();
}
} class MyThread extends Thread {
private Container container; public MyThread(Container container) {
this.container = container;
} @Override
public void run() {
container.get();
}
} class MyThread1 extends Thread {
private Container container; public MyThread1(Container container) {
this.container = container;
} @Override
public void run() {
container.put();
}
} class Container {
boolean flag = true; public synchronized void put() {
while (true) {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "放入内容.......");
flag = false;
// 唤醒拿内容线程
notifyAll();
}
} public synchronized void get() {
while (true) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "拿出内容.......");
flag = true;
notifyAll();
}
}
}
使用synchronized实现生产消费者模式
package com.thread.demo.cooperation;

/**
* 使用synchronized实现生产消费者模式
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) {
AppleContainer container = new AppleContainer();
new Thread(new Producer(container),"AA").start();
new Thread(new Consumer(container),"BB").start();
}
} // 生产者
class Producer implements Runnable { private AppleContainer container; public Producer(AppleContainer container) {
this.container = container;
} @Override
public void run() { for (int i = 0; i < 10; i++) {
try {
System.out.println("生产----------------------苹果:" + (i+1));
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
} container.increace();
}
}
} // 消费者
class Consumer implements Runnable { private AppleContainer container; public Consumer(AppleContainer container) {
this.container = container;
} @Override
public void run() { for (int i = 0; i < 10; i++) {
try {
System.out.println(Thread.currentThread().getName()+"消费----------------------苹果:" + (i+1));
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
} container.decreace();
} }
} class AppleContainer {
private int apple; public synchronized void increace() {
if (apple == 5) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
apple++;
System.out.println("生产有苹果:"+apple);
notifyAll();
} public synchronized void decreace() {
if (apple == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
apple--;
System.out.println("消费有苹果:"+apple);
notifyAll();
}
}
使用阻塞队列实现生产消费者模式
package com.thread.demo.cooperation;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; /**
* 使用阻塞队列实现生产消费者模式
* @author Administrator
*
*/
public class Demo3 {
public static void main(String[] args) {
// 创建阻塞队列(先进先出)
BlockingQueue<Integer> proQueue = new LinkedBlockingQueue<>(4);
new Thread(new ProducerQueue(proQueue),"AA").start();
new Thread(new ConsumerQueue(proQueue),"BB").start();
}
} class ProducerQueue implements Runnable { private BlockingQueue<Integer> proQueue; public ProducerQueue(BlockingQueue<Integer> proQueue) {
this.proQueue = proQueue;
} @Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("生产了编号为:"+i);
try {
Thread.sleep(1000);
proQueue.put(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} } class ConsumerQueue implements Runnable { private BlockingQueue<Integer> proQueue; public ConsumerQueue(BlockingQueue<Integer> proQueue) {
this.proQueue = proQueue;
} @Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
System.out.println("消费了编号为:"+proQueue.take());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} }
} }
lock实现生产消费者模式
package com.thread.demo.cooperation;

import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Demo4 {
public static void main(String[] args) {
Basket b = new Basket();
Product p = new Product(b);
ConsumerCondition c = new ConsumerCondition(b);
ConsumerCondition c1 = new ConsumerCondition(b);
new Thread(p,"生产者1").start();
new Thread(c,"消费者1").start();
new Thread(c1,"消费者2").start();
}
} // 馒头
class ManTou {
int id; public ManTou(int id) {
this.id = id;
} @Override
public String toString() {
return "ManTou" + id;
}
} // 装馒头的篮子
class Basket {
int max = 6;
LinkedList<ManTou> manTous = new LinkedList<ManTou>();
Lock lock = new ReentrantLock(); // 锁对象
Condition full = lock.newCondition(); // 用来监控篮子是否满的Condition实例
Condition empty = lock.newCondition(); // 用来监控篮子是否空的Condition实例
// 往篮子里面放馒头 public void push(ManTou m) {
lock.lock();
try {
while (max == manTous.size()) {
System.out.println("篮子是满的,待会儿再生产...");
full.await(); // wait
}
manTous.add(m);
empty.signalAll(); // notfiy
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} // 往篮子里面取馒头
public ManTou pop() {
ManTou m = null;
lock.lock();
try {
while (manTous.size() == 0) {
System.out.println("篮子是空的,待会儿再吃...");
empty.await();
}
m = manTous.removeFirst();
full.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock(); }
return m;
}
} // 生产者
class Product implements Runnable {
Basket basket; public Product(Basket basket) {
this.basket = basket;
} public void run() {
for (int i = 0; i < 10; i++) {
ManTou m = new ManTou(i);
basket.push(m);
System.out.println(Thread.currentThread().getName()+"生产了" + m);
try {
Thread.sleep((int) (Math.random() * 2000));
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
} // 消费者
class ConsumerCondition implements Runnable {
Basket basket; public ConsumerCondition(Basket basket) {
this.basket = basket;
} public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep((int) (Math.random() * 2000));
} catch (InterruptedException e) {
e.printStackTrace();
}
ManTou m = basket.pop();
System.out.println(Thread.currentThread().getName()+"消费了" + m);
}
}
}
管道输入输出流实现生产消费者模式
package com.thread.demo.cooperation;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream; public class Demo5 { public static void main(String[] args) {
/**
* 创建管道输出流
*/
PipedOutputStream pos = new PipedOutputStream();
/**
* 创建管道输入流
*/
PipedInputStream pis = new PipedInputStream();
try {
/**
* 将管道输入流与输出流连接 此过程也可通过重载的构造函数来实现
*/
pos.connect(pis);
} catch (IOException e) {
e.printStackTrace();
}
/**
* 创建生产者线程
*/
PipeProducer p = new PipeProducer(pos, "CCC");
/**
* 创建消费者线程
*/
PipeProducerConsumer c1 = new PipeProducerConsumer(pis, "AAA");
PipeProducerConsumer c2 = new PipeProducerConsumer(pis, "BBB");
/**
* 启动线程
*/
p.start();
c1.start();
c2.start();
}
} /**
* 生产者线程(与一个管道输入流相关联)
*
*/
class PipeProducer extends Thread {
private PipedOutputStream pos; public PipeProducer(PipedOutputStream pos, String name) {
super(name);
this.pos = pos; } public void run() {
int i = 0;
try {
while (true) {
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + "product:" + i);
pos.write(i);
i++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
} /**
* 消费者线程(与一个管道输入流相关联)
*
*/
class PipeProducerConsumer extends Thread {
private PipedInputStream pis; public PipeProducerConsumer(PipedInputStream pis, String name) {
super(name);
this.pis = pis;
} public void run() {
try {
while (true) {
System.out.println(Thread.currentThread().getName() + "consumer1:" + pis.read());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

死锁,线程协作(同步,阻塞队列,Condition,管道流)的更多相关文章

  1. 一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 21.对线程安全的理解 22.Thread和Runnable的区别 23.说说你对守护线程的理解 24.ThreadLoc ...

  2. java 线程池线程忙碌且阻塞队列也满了时给一个拒接的详细报告

    线程池线程忙碌且阻塞队列也满了时给一个拒接的详细报告.下面是一个自定义的终止策略类,继承了ThreadPoolExecutor.AbortPolicy类并覆盖了rejectedExecution方法把 ...

  3. c++ 同步阻塞队列

    参考:<C++11深入应用> 用同步阻塞队列解决生产者消费者问题. 生产者消费者问题: 有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之 ...

  4. 线程高级应用-心得7-java5线程并发库中阻塞队列Condition的应用及案例分析

    1.阻塞队列知识点 阻塞队列重要的有以下几个方法,具体用法可以参考帮助文档:区别说的很清楚,第一个种方法不阻塞直接抛异常:第二种方法是boolean型的,阻塞返回flase:第三种方法直接阻塞. 2. ...

  5. 源码剖析ThreadPoolExecutor线程池及阻塞队列

    本文章对ThreadPoolExecutor线程池的底层源码进行分析,线程池如何起到了线程复用.又是如何进行维护我们的线程任务的呢?我们直接进入正题: 首先我们看一下ThreadPoolExecuto ...

  6. Java:阻塞队列

    Java:阻塞队列 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. 概述 概念 队列 队列就可以想成是一个数组,从一头进入,一头出去,排队买饭 阻塞队列 B ...

  7. 阻塞队列---ArrayBlockingQueue,LinkedBlockingQueue,DelayQueue源码分析

    阻塞队列和非阻塞队列阻塞队列和非阻塞队列的区别:阻塞队列可以自己阻塞,非阻塞队列不能自己阻塞,只能使用队列wait(),notify()进行队列消息传送.而阻塞队列当队列里面没有值时,会阻塞直到有值输 ...

  8. java高并发系列 - 第25天:掌握JUC中的阻塞队列

    这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...

  9. 【JUC】阻塞队列&生产者和消费者

    阻塞队列 线程1往阻塞队列添加元素[生产者] 线程2从阻塞队列取出元素[消费者] 当队列空时,获取元素的操作会被阻塞 当队列满时,添加元素的操作会被阻塞 阻塞队列的优势:在多线程领域,发生阻塞时,线程 ...

随机推荐

  1. function——函数声明头的提升和预解析

    函数: 即function语句的集合,就是将多个语句封装到一起: 函数的执行要会自己遍历,遇见函数 a():执行语句,就要移交控制权,函数执行完毕之后,控制权又移交回来了! 函数的参数要罗列在func ...

  2. SQL 学习——简序以及学习路线

    1.最近发现自己除去简单的SQL语句好像其他的并不怎么懂哎,虽然暂时是android用不到太复杂点的语句,想来总不能一直这样把, 顺带还是看看Sql. 2.画个图规划下自己的学习路线

  3. 关于app夜间模式那点事

    大半年没写过代码了 一直在忙一些其他的事情  这几天想起来看了一点  心惊肉跳的 发现好陌生  所以打算今后慢慢的拾起来  往深度和广度去发展 发现好久之前写的一个微博项目  有一个夜间模式的功能没有 ...

  4. AARRR:互联网创业者一定要掌握的指标

    创业公司如何做数据分析?网站分析工具里的指标千百种,到底要从哪些数据入手呢?除了流量跟转换率,还有哪些数据跟公司成长有关呢?或许可以从了解AARRR Metrics开始.AARRR Metrics是由 ...

  5. iOS-Core-Animation-Advanced-Techniques/12-性能调优/性能调优.md

    性能调优 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...

  6. Xcode7 下导入第三方库 图文介绍

    网上没有很好的图文介绍,干脆我自己写一个好了,方便新手入门. 这里以导入著名的第三方网络库AFNetWorking v3.0.4和数据库FMDB v2.6.2为例进行说明. 好,下面开始. 下载源文件 ...

  7. Java基础——Servlet

    什么是Servlet Servlet是Java Web的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: l  ...

  8. es6——Proxy和Reflect

    Proxy代理,Reflect反射 Proxy对属性的读取 { //供应商,原始对象 let obj={ time:'2017-1-1', name:'net', _r:123 } //代理商,新生成 ...

  9. sklearn学习7-----决策树(tree)

    1.使用示例 2.树模型参数:[很多参数都是用来限制树过于庞大,即担心其过拟合] #  1.criterion  gini  or  entropy:用什么作为衡量标准 ( 熵值或者Gini系数 ). ...

  10. BootStrap复习总结

    Bootstrap3 复习总结: 1. 栅格系统: sm:768px md:992px lg:1200px (响应式布局) 1.横向分割页面的空间. 2.在分割的同时考虑到响应式. 内部实现是12列的 ...