java 分布式锁与并发锁,关于java高并发编程进行锁的性能判断时
场景介绍你一定遇到过这样的场景:
你在和你的女神约会。她说她想喝奶茶。你去奶茶店给她买的。
我发现她在和一个帅哥聊天,手里拿着没开封的奶茶。
你站在那里不知所措.
把你和帅哥当成并发线程,把女神当成你需要争夺的资源。你能理解多线程状态下对象值的不安全性吗?
要是女神能在我处理完自己的事情后再处理别人的事,只对我专一就好了!
于是,锁的概念出现了。
假设,女神只能同时接受一个舔狗的善意,只能在当前狗把自己舔出来的时候继续接受别人的善意,这样才能保证女神的专一性!
对,就是这样。女神海王再也不能同时和八只舔狗聊天了。她只能同时和一个人聊天,大大降低了养鱼的效率!
什么是锁回主题,Java里的锁是什么?为什么有锁?
举个栗子来看这样一段代码:
公共类同步{
int num=0;
私有void add(){
system . out . println(thread . current thread()。getName()-num: num );
}
公共静态void main(String[] args){
Sync Sync=new Sync();
for(int I=0;i 1000i ) {
Thread thread=新线程(sync:add);
thread . start();
}
}
}其中一次运行的结果是:
线程2号:2
螺纹3号:6
线号:7
线号:8
线号:9
10号线:11
螺纹11号:12号
螺纹12号:13
螺纹13号:14
螺纹6号:5号
线程数:1
线程4号:3
螺纹18号:19号
Thread-5 - num:4: 4可以看出,如果线程按照线程的抢占顺序逐个修改num的值,那么当线程2(Thread-2)抢占资源时,打印的结果应该是1,结果却是2。当线程3(Thread-3)抢占资源时,打印结果应该是3,结果却是6。
说明在这个线程执行num之前,其他线程已经获取了num并对其进行了修改,所以num的结果和预期的不一样,这就是并发编程导致的问题。
那么,试着给这个资源加一个锁?值能像预期的那样一个一个累加吗?
锁定Java可以使用synchronized关键字来锁定资源。
看,给这个物体加一把锁:
私有void add(){
同步(这){
system . out . println(thread . current thread()。getName() num: num);
}
}之后是这样运行的:
线程0数量:1
螺纹3号:2
螺纹-4号:3
螺纹-2数量:4
线程1编号:5
螺纹6号:6
螺纹-7号:7
螺纹-5号:8
螺纹8号:9
螺纹-9号:10
Thread-10 num: 11果然不出所料!
总结锁的基本概念:
同时,这个对象只允许一个线程访问和修改资源。
为什么要锁?
锁定可以解决资源同步问题和并发可能导致的奇怪错误。
不容易理解?
很简单,你不希望你的女神在和你约会的时候和别的男人暧昧吧?
版权归作者所有:原创作品来自博主、程序员,转载授权请联系作者,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。