java 分布式锁与并发锁,关于java高并发编程进行锁的性能判断时

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: