java的多线程学习,第五记

死锁问题;

public class DeadLock {

    //锁的嵌套 会出现死锁
    //1 尽量不要去写锁嵌套
    //2

    private static Object locka = new Object();
    private static Object lockb = new Object();

    public static void main(String[] args) {
        new DeadLock().deadLock();
    }

    private void deadLock() {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (locka){
                    try {
                        System.out.println(Thread.currentThread().getName()+"获取A锁 ing~!");
                        Thread.sleep(500);
                        System.out.println(Thread.currentThread().getName()+"睡眠 500ms!");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"需要B锁!!!");
                    synchronized (lockb){
                        System.out.println(Thread.currentThread().getName()+"B锁中!!!");
                    }
                }
            }
        },"thread1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lockb){
                    try {
                        System.out.println(Thread.currentThread().getName()+"获取B锁 ing~!");
                        Thread.sleep(500);
                        System.out.println(Thread.currentThread().getName()+"睡眠 400ms!");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"需要A锁!!");
                    synchronized (locka){
                        System.out.println(Thread.currentThread().getName()+"A锁中!");
                    }
                }
            }
        },"thread2");

        thread1.start();
        thread2.start();
    }

}
锁的嵌套 会出现死锁1 尽量不要去写锁嵌套2 锁嵌套的顺序3 引入超时机制

原文地址:https://www.cnblogs.com/fuckingPangzi/p/10157225.html

时间: 2024-10-03 22:49:19

java的多线程学习,第五记的相关文章

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

java之jvm学习笔记五(实践写自己的类装载器)

java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先定义自己的类装载器,从Clas

C#多线程学习之(五)使用定时器进行多线程的自动管理

本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: ? 1 Timer timer = new Timer(timerDelegate, s,1000, 1000); 第一个参数:指定了TimerCallback 委托,表示要执行的方法:第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用:第三

java的多线程学习,第三记

一,Java内存模型 Java内存模型规定了所有的内存变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来).线程对变量的所有操作(读取,赋值)都必须在工作内存中进行.不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均通过主内存来完成 基于这种模型的多线程就会出现很多问题,多线程的---------脏读数据 举例说明: i=123++; 现在有同时2个线程执行这段代码,加入初始值为123,那么有两个线程正

黑马程序员------Java中多线程学习总结(二)

Java培训.Android培训.iOS培训..Net培训,期待您的交流 在Java多线程中,如果有多个线程同时操作共享数据时,就可能会发生数据异常 如下面这段代码: /* * 模拟卖票 */ class Ticket implements Runnable { private int tick = 10; Object obj = new Object(); public void run() { while(true) { if(tick>0) { try{Thread.sleep(10);

黑马程序员------Java中多线程学习总结(一)

Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! 一.多线程的概念 进程:是一种“自包容”的运行程序,有自己的地址空间. 基于进程的特点是允许计算机同时运行两个或更多的程序 线程:是进程内部单一的一个顺序控制流 . 基于线程的多任务处理环境中,线程是最小的处理单位. 在Java中,一个应用程序可以包含多个线程.每个线程执行特定的任务,并可与其他线程并发执行.多线程使系统的空转时间减少,提高了CPU的利用率.多线程编程隐藏了CPU在任务之间切换的事实. 二.创建

【Java】多线程学习——wait、notify和notifyAll

Java多线程非常复杂,可以使用BlockingQueue和Executor等工具类来简化使用.但还是要弄清wait().notify()和notifyAll()的作用和用法.它们都是native方法 一.wait() 作用:告诉当前调用它的方法释放锁并sleep,直到其它某个线程也进入sleep状态且调用notify()方法. 注意:该线程在进入waiting之前释放锁,并在wait()方法返回之前重新获取锁.也就是说wait()方法调用之后线程释放锁,然后进入waiting状态. 一直到其它

多线程学习笔记五-------------多生产者多消费者问题

线程通信--多生产者多消费者问题 多生产者,多消费者会导致线程死锁的情况. public class RoastDuck { public static void main(String[] args) { Duck d = new Duck(); ProductProcess pp = new ProductProcess(d); ProductProcess pp0 = new ProductProcess(d); ConsumeProcess cp = new ConsumeProcess

C# 多线程学习(五)线程同步和冲突解决

from:https://blog.csdn.net/codedoctor/article/details/74358257 首先先说一个线程不同步的例子吧,以下为售票员的模拟售票,多个售票员出售100张门票,代码如下: using System; using System.Text; using System.Collections.Generic; using System.Threading; namespace threadTest { class Program { class Thr