线程安全问题,两种锁(synchronized锁和Lock锁)
创始人
2025-05-31 20:30:46

安全问题

多个线程同时操作一个共享数据时,就有可能造成错误,如重复操作,多于操作,例子:100张票,三个线程同时抢,那么就可能出现两个线程显示拿到了同一张票,但是每一张票有且只有一张欧,如下:

  • 和计算机操作系统中出现的问题一样,一线程执行到ticket++时停止了,二线程在运行时也执行到ticket++,然后一线程再拿到cpu继续开始运行下面的代码,此时就会出错,因为,ticket++了两次,和一线程预期的样子偏离了
  • 对了,ticket应当被静态修饰,否则不同线程进来拿的将不是同一个ticket
package com.itjh.pojo;public class Ticket extends Thread{static int ticket=0;public Ticket(String name){super(name);}public void run(){while(true){if (ticket<50){ticket++;System.out.println(getName()+"。。。正在贩卖第"+ticket+"张票");try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}else {break;}}}
}

测试类(三个线程):

package com.itjh.Test;import com.itjh.pojo.Ticket;public class TestTicket {public static void main(String[] args) {Ticket ticket1=new Ticket("小飞棍");ticket1.start();Ticket ticket2=new Ticket("小菁菁");ticket2.start();Ticket ticket3=new Ticket("小赤佬");ticket3.start();}
}

结果:出现了同一张票被多个线程拿到,别的情况就在这展示了

小菁菁。。。正在贩卖第196张票
小赤佬。。。正在贩卖第196张票
小飞棍。。。正在贩卖第197张票
小赤佬。。。正在贩卖第198张票
小菁菁。。。正在贩卖第198张票
小飞棍。。。正在贩卖第199张票
小赤佬。。。正在贩卖第199张票
小菁菁。。。正在贩卖第200张票Process finished with exit code 0

解决办法:

  • 加入synchronized锁,进来一个线程就会上锁,直到此线程退出来为止
  • synchronized()中应当添加静态对象(参数可以使用Object类的对象,记得加static)因为只有静态的 才会是唯一的,否则锁会不唯一,那么锁就失去效果了
package com.itjh.pojo;public class Ticket extends Thread{static int ticket=0;public Ticket(String name){super(name);}static Object object=new Object();public void run(){while(true){synchronized (object){if (ticket<200){ticket++;System.out.println(getName()+"。。。正在贩卖第"+ticket+"张票");try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}else {break;}}}}
}

synchronized()锁:

  • 唯一的,可以用静态的对象来满足,当然也可以用当前类的字节码文件,因为这个一定是唯一的,即当前类.class
  • 关闭锁这个操作是自动的
  • 也可以添加在方法上,如
public synchronized void show(){ }

Lock锁:

和上面的synchronized相比,Lock锁的开关是手动的

package com.itjh.pojo;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Ticket extends Thread{static int ticket=0;public Ticket(String name){super(name);}Lock lock=new ReentrantLock();public void run(){while(true){lock.lock(); {if (ticket < 50) {ticket++;System.out.println(getName() + "。。。正在贩卖第" + ticket + "张票");try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}} else {break;}}lock.unlock();}}
}

问题:

有可能在第49张票时一线程结束了,然后一线程又抢到了cpu那么就会执行break方法,于是lock.unlock();就不会被执行了,于是锁没管,代码一直运行,即使没有进行实际的操作,如图

解决办法:

利用finally{}方法,将lock.unlock();放进去就行

相关内容

热门资讯

VC是什么,vc是什么? 极速... VC是什么目录VC是什么vc是什么?VC指什么?vc是什么意思?VC是什么 VC是风险投资(V...
半妖倾城的结局是什么,半妖倾城... 半妖倾城的结局是什么目录半妖倾城的结局是什么半妖倾城结局是be吗电视剧(半妖倾城)结局是什么?半妖倾...
排除通用新君越6T40E自动变... 今天给各位分享排除通用新君越6T40E自动变速器烧片故障的知识,其中也会对别克君越变速箱维修视频进行...
女生日常的基本化妆都需要哪些东... 女生日常的基本化妆都需要哪些东西目录女生日常的基本化妆都需要哪些东西女生日常的基本化妆都需要哪些东西...
支付宝蚂蚁森林怎么刷能量 极速... 支付宝蚂蚁森林怎么刷能量目录支付宝蚂蚁森林怎么刷能量支付宝蚂蚁森林怎么刷能量 蚂蚁森林是支付宝...
足球禁区是什么意思,足球比赛中... 足球禁区是什么意思目录足球禁区是什么意思足球比赛中的“禁区”是指什么?足球场上大禁区小禁区的含义是什...
说唱里面的time是什么意思哈... 说唱里面的time是什么意思哈目录说唱里面的time是什么意思哈说唱中的time是什么意思Hey S...
怎么把电脑音量调节更大,电脑声... 怎么把电脑音量调节更大目录怎么把电脑音量调节更大电脑声音怎么调大怎么才能把电脑的声音调的更大点?如何...
岁末将至敬颂冬绥什么意思,岁末... 岁末将至敬颂冬绥什么意思目录岁末将至敬颂冬绥什么意思岁末将至的下一句是什么?岁末将至,敬颂冬绥是什么...
乌合之众的乌是指什么动物(乌合... 本篇文章极速百科给大家谈谈乌合之众的乌是指什么动物,以及乌合之众的动物是什么生肖对应的知识点,希望对...
什么是有理数(什么是有理数定义... 今天给各位分享什么是有理数的知识,其中也会对什么是有理数定义进行解释,如果能碰巧解决你现在面临的问题...
绿萝施什么肥料长得好,绿萝最好... 绿萝施什么肥料长得好目录绿萝施什么肥料长得好绿萝最好的肥料是啥绿萝施什么肥?绿萝用什么肥料长得快 让...
古剑奇谭3开场动画及结局剧情分... 古剑奇谭3开场动画及结局剧情分析目录古剑奇谭3开场动画及结局剧情分析古剑奇谭3开头怎么那么长仙剑3的...
新华字典中方字的笔划顺序是什么... 新华字典中方字的笔划顺序是什么目录新华字典中方字的笔划顺序是什么方子的笔画中国汉字的总方针是先上,后...
和地球最相似的星球叫什么,最像... 和地球最相似的星球叫什么目录和地球最相似的星球叫什么最像地球的星球与地球最相似的星球叫什么?和地球最...
什么是几九,几九是什么意思 极... 什么是几九目录什么是几九几九是什么意思今天是几九了啊,一九,二九,三九,四九,五九,是什么意思什么是...
东北都有什么特色小零食啊,东北... 东北都有什么特色小零食啊目录东北都有什么特色小零食啊东北特产零食东北特色小吃东北三省各自有什么特色零...
化妆棉的作用有哪些,化妆棉的作... 化妆棉的作用有哪些目录化妆棉的作用有哪些化妆棉的作用化妆棉有什么作用?化妆棉的作用有哪些 1....
六道有哪六道,火影忍者六道能力... 六道有哪六道目录六道有哪六道火影忍者六道能力六道轮回,都有哪六道?六道是指哪六道?六道有哪六道 ...
飞信手机多方通话怎么用(飞信手... 本篇文章极速百科给大家谈谈飞信手机多方通话怎么用,以及飞信手机好友收费吗对应的知识点,希望对各位有所...
会计中的流动资产包括哪些,下列... 会计中的流动资产包括哪些目录会计中的流动资产包括哪些下列会计科目中,属于流动资产的是(  )。会计基...
旺旺碎冰冰是什么梗的简单介绍 ... 本篇文章极速百科给大家谈谈旺旺碎冰冰是什么梗,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站...
怎样给芭比做衣服,给芭比娃娃做... 怎样给芭比做衣服目录怎样给芭比做衣服给芭比娃娃做衣服怎么做不用缝怎样帮芭比娃娃做衣服怎样给芭比做衣服...
如何区分,植物油,矿物油,白油... 本篇文章极速百科给大家谈谈如何区分,植物油,矿物油,白油,液蜡?,以及怎么区别植物油和矿物油对应的知...
武汉空气为什么那么差(为什么武... 本篇文章极速百科给大家谈谈武汉空气为什么那么差,以及为什么武汉空气质量这么差对应的知识点,希望对各位...
美国4大全尺寸皮卡之一,性能不... 本篇文章极速百科给大家谈谈美国4大全尺寸皮卡之一,性能不输福特猛禽,通用塞拉...,以及美国皮卡车品...
skp是啥(SKP是啥格式) ... 本篇文章极速百科给大家谈谈skp是啥,以及SKP是啥格式对应的知识点,希望对各位有所帮助,不要忘了收...
C1的教练资格证要怎么考,c1... C1的教练资格证要怎么考目录C1的教练资格证要怎么考c1教练资格证怎么考取怎么考c1汽车教练资格证?...
经典一词中的典是什么意思,经典... 经典一词中的典是什么意思目录经典一词中的典是什么意思经典的典是什么意思经典的典是什么意思?请问金典和...
什么叫做商,什么是商? 极速百... 什么叫做商目录什么叫做商什么是商?除法算式里的商是什么意思什么是商?什么叫做商 “商”的含义可...