显示锁与隐式锁
前言
那我在搜索多线程有关于锁的知识的时候发现,基本上所有的博客内容都是出自同一篇文章,啊,知识就是这样传播开来的。那我就觉得我既然也学习了这个知识点那就做点不一样的,当然我也很希望大家都能转载我这篇博客,留言说一声就行,点个赞再走也不错,能收藏那就是极好不过了,不转载学习讨论留言评论区大家一起探讨也是极好的。
好,开始我们的学习,那在开始本次的学习中我希望大家能够了解,什么是锁,锁的定义概念是什么,锁它要什么用,锁它会在哪里去使用呢?
其实我们生活中到处都有锁的身影,自行车锁,车锁,门锁,还有你们那难以打开的心锁。。。等等。对吧,那我们都知道锁的存在,那谁能说一下锁它为什么要存在呢?好,没人说,那我说啊,那不管是上面的哪个锁是不是都是在防止盗窃,防止我们的财产不被他人恶意侵占,防止不好的事情发生。那锁的存在就给了我们一定程度上的安全感没错吧。那这也是Java中锁的意义所在。那我们的显式锁与隐式锁的意义也就是在Java多线程的任务执行中保护我们线程能够好好的,不被阻断的进行下去。
那谈到了锁就必然会存在安全问题。我们也经常听到别人说线程安全不安全的,注意,面试官也经常问线程安全的奥。 那既然涉及到了这个知识点,那我们先来聊一聊什么是线程安全。
线程安全
什么是线程安全?
多个线程同一时刻对同一个全局变量(同一份资源)做写操作(读操作不会涉及线程安全)时,如果跟我们预期的结果一样,我们就称之为线程安全,反之,线程不安全。
不知道大家打过架没有?反正我肯定是没有打过架了,好好学生一枚的说!(我都是往死里打。),好继续说回来。那假设你们家你有个姐姐,没错,总是欺负你的那个女人,她每次都会在你们吃饭的时候和你抢饭吃,不是穷,没饭吃,而是总抢你的饭吃。你没有听错,她就是总抢你的饭吃。(那时候我还小,打不过她,到了10+了,更打不过了,女孩发育早的说。别给我说,什么姐姐最好了,那我小的时候最怕的就是她,很烦,打也打不过,你放弃,她还穷追不舍,拿话讽刺你。啊,那种感觉我现在回想起来还是有点气。)。好,回归到打架的阶段,那她总是要和你吃同一口,抢一个食,那是不是你们就筷子会打架,最后你被打。对吧,那这就是不安全。
源码案例解释
public class Demo7 {
public static void main(String[] args) {
//线程不安全
Runnable run = new Ticket();
new Thread(run).start();
new Thread(run).start();
new Thread(run).start();
}
static class Ticket implements Runnable{
//票数
private int count=10;
@Override
public void run() {
while (count>0){
//卖票
System.out.println("正在准备卖票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count--;
System.out.println("出票成功,余票:"+count);
}
}
}
}
没错,就是市面上的例子,我就不浪费心思了,反正知识点都是一样的。
好,我们来瞧一瞧在线程不安全下的运行结果。