死锁,线程协作(同步,阻塞队列,Condition,管道流)

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();
        }

    }

}

原文地址:https://www.cnblogs.com/sunBinary/p/10589030.html

时间: 2024-08-30 04:49:23

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

CoreJava_线程并发(阻塞队列):在某个文件夹下搜索含有某关键字的文件

Java多线程编程是非常考验一个程序员水平的.传统的WEB程序中,因为框架提供了太多的健壮性.并发性.可靠性的支持,所以我们都是将所有的注意力放到了业务实现上.我们只是按照业务逻辑的要求,不停的积累自己的代码.因为知识,或者是经验的限制,经常出现了问题而不自知.例如,某些比较原始的项目中,并没有使用Spring等相对来说比较灵活健壮的框架.而是仅仅使用Servlet来作为服务端的实现方式. 举一个简单的栗子,众所周知,当请求到了容器,容器是创建并且启动了一个Servlet线程来对当前的请求作出相

c++ 同步阻塞队列

参考:<C++11深入应用> 用同步阻塞队列解决生产者消费者问题. 生产者消费者问题: 有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池, 生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步, 即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品. //SyncQueue.hpp #

Java并发:线程间同步-条件队列和同步工具类

转载请注明出处: jiq?钦's technical Blog - 季义钦 线程之间的同步,除了互斥(前面介绍的互斥锁)之外,还存在协作关系,下面我们就介绍一下java线程间常见的一些协作方式. 一.内置条件队列 正如每个Java对象都可以作为一个内置锁,每个对象也可以作为一个条件队列,称为内置条件队列,Object.wait().notify()/notifyAll()构成了内置条件队列的API. 需要注意的是,调用任何对象X的内置条件队列的API都必须要先获得该对象X的内置锁. 1.API介

跟我学Java多线程——线程池与阻塞队列

前言 上一篇文章中我们将ThreadPoolExecutor进行了深入的学习和介绍,实际上我们在项目中应用的时候很少有直接应用ThreadPoolExecutor来创建线程池的,在jdk的api中有这么一句话"但是,强烈建议程序员使用较为方便的 Executors 工厂方法Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收).Executors.newFixedThreadPool(int)(固定大小线程池)和Executors.newSingleT

阻塞队列和生产者-消费者模式、DelayQueue

1.ArrayDeque, (数组双端队列) 2.PriorityQueue, (优先级队列) 3.ConcurrentLinkedQueue, (基于链表的并发队列) 4.DelayQueue,                                         (延期阻塞队列)(阻塞队列实现了BlockingQueue接口) 5.ArrayBlockingQueue,           (基于数组的并发阻塞队列) 6.LinkedBlockingQueue,        (基

Java 集合框架(五):阻塞队列

阻塞队列 如果我们想要在线程安全的场景下使用队列,只有两个选择,一个是上面讲过的 ConcurrentLinkedQueue,还有就是我们要将的阻塞队列. 从名字我们就可以判断出阻塞队列适用的场景,那就是生产者消费者模式.阻塞对垒的添加和删除操作在队列满或者空的时候会被阻塞.这就保证了线程安全. 阻塞队列提供了四种处理方法: 方法 抛异常 返回特殊值 一直阻塞 超时退出 插入 add(E e) offer(e) put(e) offer(e,time,unit) 删除 remove() poll

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列. 注:什么叫线程安全?这个首先要明确.线程安全就是说多线程访问同一代码,不会产生不确定的结果. 并行和并发区别 1.并行是指两者同时执行一件事,比如赛跑,两个人都在不停的

JDK5新特性之阻塞队列(四)

一. 阻塞队列和普通队列: 队列是一种基本的数据类型,其典型特征是先进先出. 阻塞队列和普通队列的区别在于: 当队列为空时,从队列中获取元素的线程会被阻塞,直到其他的线程往空的队列里插入新的元素: 当队列是满的时,往队列里添加元素的操作会被阻塞,直到其他的线程从队列移除一个或多个元素: 上图中:线程1往阻塞队列里添加元素,而线程2从阻塞队列里移除元素 /** * 阻塞队列的简单实现 */ public class BlockingQueue<T> { private List<T>

多线程之消费者生产者模式加入阻塞队列

队列相关资料: http://chenjumin.iteye.com/blog/2182322 http://blog.csdn.net/luohuacanyue/article/details/16359777 Queue ------------ 1.ArrayDeque, (数组双端队列) 2.PriorityQueue, (优先级队列) 3.ConcurrentLinkedQueue, (基于链表的并发队列) 4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQ