线程同步——死锁问题

1、问题

1.1  产生的原因

  系统有两个线程在跑,每个线程有两个锁,当线程一用了锁1,这个时候jvm调用线程二用了锁2,这个时候线程二不能打开锁1,程序就一直停在这里了

1.2  具体问题

  有两个人Aman和Bman去执行刺杀任务,看成两个线程,老板那里只有一把匕首,要刺杀的只有一个人。Aman拿到了匕首,准备去接刺杀任务,但是任务却被Bman接了。Aman没有接刺杀任务,不能刺杀。Bman没有匕首,不能完成刺杀

1.3  解决办法

  推荐不要用嵌套synchronized

2、代码

  

 1 public class Demo {
 2     public static void main(String[] args) {
 3         String s1 = "匕首";
 4         String s2 = "刺杀";
 5         new Thread() {
 6
 7             @Override
 8             public void run() {
 9                 while (true) {
10                     synchronized (s1) {
11                         System.out.println(this.getName() + "拿到匕首" + "准备刺杀");
12                         synchronized (s2) {
13                             System.out.println(this.getName() + "正在刺杀");
14                         }
15                     }
16                 }
17             }
18
19         }.start();
20
21         new Thread() {
22
23             @Override
24             public void run() {
25                 while (true) {
26                     synchronized (s2) {
27                         System.out.println(this.getName() + "拿到匕首" + "准备刺杀");
28                         synchronized (s1) {
29                             System.out.println(this.getName() + "正在刺杀");
30                         }
31                     }
32                 }
33             }
34
35         }.start();
36     }
37 }

原文地址:https://www.cnblogs.com/Dbbf/p/9175174.html

时间: 2024-10-13 23:43:25

线程同步——死锁问题的相关文章

java中多线程的线程同步死锁问题

/* *定义一个多线程 */ package com.thread; public class TicketThread2 implements Runnable { //定义1000张票 public static int ticket = 100; Object obj = new Object(); // public boolean flag = false; // public boolean exit = false; @Override public void run() { //

多线程——线程同步,死锁

线程同步: 为什么需要同步 ①   线程同步是为了防止多个线程访问一个数据对象时,对数据造成破坏. ②   线程的同步是保证多线程安全访问竞争资源的一种手段. 同步和锁 ①   Java中每一个对象都有一个内置锁. ②   当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁:当程序运行到synchronized同步代码块时,自动获得锁定对象的锁. ③   获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步.当程序运

Android多线程研究(3)——线程同步和互斥及死锁

为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runnable{ private TestObj testObj = new TestObj(); public static void main(String[] args) { ThreadTest2 tt = new ThreadTest2(); Thread t1 = new Thread(tt,

Java之线程,常用方法,线程同步,死锁

1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 切换而不是同步 一个程序中的方法有几条执行路径, 就有几个线程 Java中线程的生命周期 Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t =

Java笔记六.线程同步、线程死锁

线程同步.线程死锁 在上一篇文章中,有一个模拟售卖火车票系统,在卖车票的程序代码中,极有可能碰到一种意外,就是同一张票号被打印两次多次,也可能出现打印出0甚至负数的票号.具体表现为:假设tickets的值为1的时候,线程1刚执行完if(tickets>0)这行代码,正准备执行下面的代码,就在这时,操作系统将CPU切换到了线程2上执行,此时tickets的值仍为1,线程2执行完上面两行代码,tickets的值变为0后,CPU又切回到了线程1上执行,线程1不会再执行if(tickets>0)这行代

Java线程同步与死锁、生产者消费者模式以及任务调度等

一.Thread类基本信息方法 package Threadinfo; public class MyThread implements Runnable{ private boolean flag = true; private int num = 0; @Override public void run() { while(flag) { System.out.println(Thread.currentThread().getName()+"-->"+num++); } }

Android多线程研究(3)——线程同步和相互排斥及死锁

为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runnable{ private TestObj testObj = new TestObj(); public static void main(String[] args) { ThreadTest2 tt = new ThreadTest2(); Thread t1 = new Thread(tt,

线程同步与死锁

一.多线程共享数据 在多线程的操作中,多个线程有可能同时处理同一个资源,这就是多线程的共享数据. 二.线程同步 解决数据共享的安全问题,必须使用同步,所谓同步就是指多个线程在同一个时间段内只能有 一个线程执行指定代码,其他线程要等待此线程完成之后才可以继续执行. 线程进行同步,有下面两种方法: 1).同步代码块. synchronized(要同步的对象){ 要同步的操作; } 2).同步方法(同步的是当前对象,this) public synchronized void method(){ 要同

线程同步之——互斥量及死锁问题

互斥量:多个线程同时访问共享数据时可能会冲突,这跟信号的可重性是同样的问题.如 果两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 1. 从内存读变量值到寄存器 2. 寄存器的值加1 3. 将寄存器的值写回内存 先举个例子:创建两个线程,各把counter增加5000次,正常情况下最后counter应该等于10000. 代码实现如下: 结果: 可以看到,每次运行程序的结果都不一样.说明在调用过程中发生了互斥现象. 解决办法:加互斥锁 实现多线程同步可以引互斥锁(Mutex,M