JAVA提高篇(34)-- Java多线程的同步与死锁
来源:互联网 发布:视频同声翻译软件 编辑:程序博客网 时间:2024/06/12 19:48
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
知识要点:
了解线程同步的作用
了解同步代码块以及同步方法的使用
了解死锁的产生
在多线程开发中,同步与死锁是至关重要的需要掌握以下几点:
1、哪里需要同步
2、如何实现同步
3、以及实现同步之后会有哪些副作用。
问题的引出
以卖火车票为例,不管在哪个地方买火车票,最终一趟列车的车票数量是固定的,如果将多个售票点理解为线程的话,则所有线程应该共同拥有同一份票数。
从程序的执行结果看,卖出的票数成了负数,程序代码出了问题。
程序的问题:
从运行的结果可以发现,程序中加入了延迟操作,所以在运行的最后出现了负数的情况,那么为什么会出现这种情况呢?
从上面的操作代码可以发现对于票数的操作步骤如下:
1、判断票数是否大于0,大于0则表示还有票可以卖。
2、如果票数大于0,则卖票出去。
但是,在上面的操作代码中,第1步和第2步之间加入了延迟操作,那么一个线程就有可能在还没有对票数进行减操作之前其他线程就已经将票数减少了,这样一来就会出现票数为负的情况。
问题的解决:
如果想解决这样的问题就必须使用同步,所谓的同步就是指多个操作在同一个时间段内只能有一个线程执行,其他线程要等待此线程完成之后才能继续执行。
使用同步问题
想解决资源共享的同步操作问题,可以使用同步代码块和同步方法两种方式完成。
已知代码块分为四种:
普通代码块:是直接定义在方法之中的。
构造块:是直接定义在类中的,优先于构造方法执行,重复调用。
静态块:是使用static关键字声明的,优先于构造块执行,只执行一次。
同步代码块:使用synchronized关键字声明的代码块,称为同步代码块。
同步代码块:
在代码块上加上"synchronized"关键字的话,则此代码块就称为同步代码块。
同步代码块格式:
synchronized(同步对象){
需要同步的代码
}
同步的时候必须指明同步的对象,一般情况下会将当前对象作为同步对象,使用this表示。
从运行的结果可以发现,加入了同步操作,所以不会产生负数的情况,但是程序的执行效率明显降低很多。
同步方法:
除了可以将需要的代码设置成同步代码块之外,也可以使用synchronized关键字将一个方法声明成同步方法。
同步方法定义格式:
synchronized 方法返回值 方法名称(参数列表){ }
具体代码如下:
所谓的同步就是同样的操作在同一时间段内只能由一个线程进行访问。同步通常用于多个线程同时共享同一资源时。
过多的同步会导致线程死锁。
具体代码如下所示:
可以发现线程会因为相互等待而造成死锁。
阅读全文
0 0
- JAVA提高篇(34)-- Java多线程的同步与死锁
- Java多线程的同步与死锁
- Java 多线程同步与死锁
- JAVA - 多线程 - 同步与死锁
- java多线程同步死锁
- Java多线程之同步与死锁
- Java多线程之同步与死锁
- Java多线程 线程同步与死锁
- 黑马程序员-JAVA基础-多线程的安全、同步与死锁
- 关于Java多线程---------(3,同步与死锁)
- java多线程的同步和死锁
- java 同步与死锁
- Java多线程同步死锁例程
- Java 多线程同步、死锁问题
- java多线程-同步和死锁
- Java线程的同步与死锁
- Java线程的同步与死锁
- Java 线程的同步(synchronized)与死锁
- win10下微软office2010卸载
- 我的Laravel学习之路之模板继承
- Android数据库批量操作
- solr no servers hosting shard 503 SolrCloud分布式检索时忽略宕机的Shard
- linux 环境变量设置(临时 + 永久)
- JAVA提高篇(34)-- Java多线程的同步与死锁
- JSON字符串和java对象的互转
- 图片接口回调
- Java中,逻辑与& 和短路与&& 的区别
- 数据库加密之Xcode9.0后,sqlcipher加密:Implicit declaration of function ’sqlite3_key‘is invalid in C99问题
- Java对象的创建、访问和定位
- 【经典算法】:图的深度优先搜索与广度优先搜索的实现
- .net 反射访问私有变量和私有方法
- Animator事件