[零基础学JAVA]Java SE应用部分-25.多线程(03)

上季内容回顾:
线程的一些其他操作方法:
・ 线程的休眠:Thread.sleep() ;
本季主要知识点:
题目讲解、其他的操作方法、同步与死锁的操作
多线程习题:
image
分两种方式完成:
1、使用Thread类完成。
image
看下效果:
image
2、通过Runnable接口实现
image
效果如下:
image
中断线程的运行
image
image
image
看下效果:
image
程序执行太快了,我们再修改下程序
image
看下效果:程序休眠8秒后中断
image
最好可以让代码返回到被调用处
image
现在E --> run方法执行完毕就没有输出
image
现在我们互换下程序休眠的时间看看效果
image
OK,看下效果,此时程序休眠没被中断哈~!
image
查看线程的中断状态
image
image
image
看一下这个程序的线程名字: main
image
下面我们测试中断状态
image
看下效果:显示线程没有中断
image
下面我们加入一个线程中断
image
这时看下程序效果:显示线程中断了
image
接着看下线程能否进入休眠状态
image
发现线程不能被休眠
image
查看下现在中断状态又是什么呢?
image
发现没有被中断哈~
image
多线程问题--资源协调(重点)
image
北京的一列火车,会有多个订票点卖票,证明,所有的订票点每一个都是一个线程,所有的线程共同卖一套票。
image
验证下效果:
image
此处是没有任何延迟的情况下,暂时出现了正确的结果,下面我们来模拟下网络的延迟情况下程序的执行效果(比如延迟0.1秒)
image
image
解决这个问题我们需要使用到数据同步
同步代码块
image
Java程序中分为四种代码块:
・ 普通代码块
・ 构造块
・ static静态块
・ 同步代码块
使用关键字: synchronized
image
哈~~~程序执行没有负数出现,但是好像票都被Thread-0卖光了哈~~~
image
同步代码块加错位置,应加在程序判断位置
image
看下效果,没有问题了:
image
同步方法:
使用 synchronized声明的方法就叫同步方法
image
image
此代码中卖票将判断与ticket--放在一起操作,我们判断下效果:效果一样哈~
image
多个线程共享同一个资源,肯定是需要同步的,以保证数据的正确性,但是同步是需要牺牲性能的。
同步会有新的问题:
张三 --> 李四 |
张三的哥哥 --> 王五
李四 --> 拿出500W救出你弟弟
王五 --> 把弟弟放了,我给你500W
因为同步造成了两个人的状态停滞 --> 死锁
模拟一个死锁的情况来看:
image
我们发现程序不向下执行了,死锁了哈~~~
image
如果假设其中一个松口了,会怎么样?
image
看下效果:交易成交哈~~~
image
总结
目的:阐述概念:
多个线程共享同一个资源的时候,必须进行同步,但是过多的同步会造成系统的死锁
同步的关键字: synchronized
同步代码块中必须有一个需要同步的对象,一般都为当前对象 ―― this
#######################################################

本文出自 “王乾De技术博客” 博客,谢绝转载!

你可能感兴趣的:(java,多线程,同步,synchronized,零基础学JAVA)