java学习多线程之死锁
形成死锁的前提是同步代码块嵌套。
什么是死锁?当一个线程拿到锁以后在这个锁内部的代码需要访问另一段的代码的时候另外一个程序的锁被另外一个线程拿到,这样的话,就造成了两个锁互不想让程序没法往下执行的这种状况就是死锁。
class DeadDemoA implements Runnable
{
Object obj = new Object();
int x = ; public void run()
{ if(x == ){ while(true)
{ synchronized(obj)
{
System.out.println("-----"); showA(); System.out.println("-----"); }
showA(); } }else{ while(true)
{
showA();
x = x+;
x = x%;
} } } public synchronized void showA()
{ synchronized (obj)
{ System.out.println("SI suo"); } } } class DeadLock
{ public static void main(String[] args) { DeadDemoA a = new DeadDemoA();
Thread t1 = new Thread(a);
Thread t2 = new Thread(a);
Thread t3 = new Thread(a);
Thread t4 = new Thread(a); t1.start();
t2.start();
t3.start();
t4.start(); } }
以上就是一个死锁。
简单来说就是一段程序代码中有两个同步的代码块嵌套,也就是有两个锁,但是一个锁的执行依赖另外一个锁。
代码中A方法要调用B方法,同时这两个都是同步的,有各自的锁A比如说有A锁,B比如说有B锁,那么A方法要执行完成的话,必须同时具备A锁和B锁,如果此时B锁被其他线程拿到的话,这个时候A就等待B锁,同时其他线程也没法执行A方法,这个时候就是相互僵持,成为死锁。同时要注意,锁这个概念是针对线程的,跟本身的程序没有关系。我们再来写个死锁的示例:
class DDlock1 implements Runnable
{ private Object obj = new Object(); public void run()
{ while(true)
{
synchronized (obj)
{
show(); }
show();//let other thread get the lock
} } public synchronized void show()
{ synchronized(obj){ System.out.println("Dead lock example~");
} } } class DeadLock1
{ public static void main(String[] args) { DDlock1 d = new DDlock1(); Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
Thread t3 = new Thread(d);
Thread t4 = new Thread(d); t1.start();
t2.start();
t3.start();
t4.start(); } }
java学习多线程之死锁的更多相关文章
- Java学习多线程第一天
内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...
- Java学习---多线程的学习
基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它 ...
- java学习——多线程
本文内容来源于 历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容.这个内容可以称为线程要执行的任务. 多线 ...
- [Java学习]多线程
关于多进程与多线程 使用多进程的目的:提高CPU利用率. 使用多线程的目的:提高应用程序?利用率. 多线程与多进程区别:进程间内存独立:同一个进程的线程间共享"堆内存和方法区内存" ...
- Java学习多线程第二天
内容介绍 线程安全 线程同步 死锁 Lock锁 等待唤醒机制 1 多线程 1.1 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果 ...
- Java:多线程<三>死锁、线程间通讯
死锁: 同步嵌套同步,而且使用的锁不是同一把锁时就可能出现死锁 class Test implements Runnable { private boolean flag; Test(boolean ...
- java学习多线程之生产者消费者
在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系.那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三.李四负责生产烤鸭,王五.马六负责吃烤鸭,那么前者生产完烤 ...
- java学习多线程之卖票示例
这一节我们来说一个示例就是卖票示例: 需求: 我们现在有100张票,然后分四个窗口来卖,直到卖完为止. 思路: 1.先定一个一个票类,描述票的属性,还有打印卖出的票,并且实现Runnable中的run ...
- java学习多线程之创建多线程一
现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...
随机推荐
- hdoj1325 Is It A Tree?
Is It A Tree?题目链接 题意: 多组测试数据, 每组数据有多个数对, 表示一条有向边(即第一个数是第二个数的父节点), 以 0,0 为一组测试数据结束标志.当输入-1,-1时测试结束. 从 ...
- CWnd::UpdateData
CWnd::UpdateData 格式: BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); 描述:调用该成员函数初始化在对话框中的数据,或检索和验证对话 ...
- Angularjs2——TypeScript学习网站
https://zhongsp.gitbooks.io/typescript-handbook/content/index.html
- UITextField文本字段控件的位置
如果需要更改默认的UITextField清除按钮.左右视图等等控件的位置,可以通过如下设置: // 控制清除按钮的位置 (默认 width = 15 = height) -(CGRect)clearB ...
- Codevs 4600 [NOI2015]程序自动分析
4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 在实现程序自动分析的过程中,常常需 ...
- C语言程序设计概述
1 概论 1972年Dennis Ritchie发明了C语言,而后Dennis Ritchie又使用C语言重写了Unix系统,自那以后C语言逐渐受到了全世界大多数编程爱好者的喜爱,后期的主流操作系统L ...
- Mac OS 安装 Port
简介 MacPorts类似与apt-get以及yum等软件包管理工具,可以方便的进行安装与卸载软件的功能,同时可以自动安装软件包的依赖,非常方便,同类的还有brew等工具. 安装 下载MacPorts ...
- ECMA中关于if与else的关系的一句英文,感觉比较经典
Each else for which the choice of assocated if is ambiguous shall be associated with the nearest pos ...
- react组件什么周期记录,转的
react 的核心除了虚拟DOM,我想还有一个很重要的就是生命周期函数,理解生命周期函数,对写出合理的commponet很有帮助.下面总结一下我对生命周期函数的一些理解已经在项目过程中遇到的一些问题. ...
- css3怎么隐藏dom:4种方法
1.display:none; 2.position:absolute; left:-99999px; 3.visibility:hidden; 4.opacity:0;