黑马程序员技术交流社区

标题: 【求助】锁的对象用来干嘛? [打印本页]

作者: 黄奕豪    时间: 2012-5-19 16:58
标题: 【求助】锁的对象用来干嘛?
本帖最后由 黄奕豪 于 2012-5-19 17:14 编辑

看到多线程,看到synchronized(锁对象),看着看着就迷糊了,定义一个锁对象,任意的都行,上帝Object也行,person也行,甚至类名.class文件对象都可以,那这些有区别吗?定义了这样一个锁对象又到底有什么用啊!!搞不清,理不明啊~~~这个到底有什么特别用处~
楼下的兄弟说了,锁是用来锁共享资源的,那有synchronized关键字不就行了嘛,干嘛还要传个什么都可以的对象呢?这个对象用来干嘛啊?难道就是为了区分synchronized的么?那这样没必要要个对象吧!多耗内存啊!!!!搞个标号就行了啊!
作者: 李文富    时间: 2012-5-19 17:04
锁是一种安全机制;通常用于多线程中;
多线程一般用于并发的应用,如果强调这个系统的多任务性,那么就应该用到多线程了。
比如:你要实现一个银行系统或是实现一个C\S架构这样的系统,你就应该考虑用多线程了,
锁的出现是为了确保数据读写完成后的正确性;涉及到敏感的资源访问时就应该用到锁的机制;
多线程很容易访问共享的资源,所以需要锁定,防止某线程正在用的被其他线程调用,
所以需要先锁定该区域,用完了再释放。这就是锁的概念。
作者: 黄奕豪    时间: 2012-5-19 17:11
李文富 发表于 2012-5-19 17:04
锁是一种安全机制;通常用于多线程中;
多线程一般用于并发的应用,如果强调这个系统的多任务性,那么就应 ...

你说它是用来锁共享资源的,那不是synchronized关键字做的事么,那传个锁对象给它干嘛啊?
作者: 李文富    时间: 2012-5-19 17:20
本帖最后由 李文富 于 2012-5-19 17:35 编辑
黄奕豪 发表于 2012-5-19 17:11
你说它是用来锁共享资源的,那不是synchronized关键字做的事么,那传个锁对象给它干嘛啊? ...


那你试想任意代码块下涉及到资源的操作,一个线程在运行的过程中可能在任意一个语句停下,另一线程抢占cpu去执行读写操作,这是不安全的。这过程中还可能出现死锁,所以设计的时候应该将锁优先级设计的上帝Object也行,person也行,甚至类名.class文件对象要高。
补充一点:锁的出现的确会大大降低程序效率,的确应该做到正确的使用锁,对那个操作要明确必须上锁,在并发前提下保证数据的正确性。如果随意上锁还不如使用单线程来做。锁在多线程下是必须要的。如果想深入理解 查看下   汤子瀛《操作系统原理》那里有锁机制的详细解述
作者: 余宏    时间: 2012-5-19 17:41
在java虚拟机中,每个对象和类在逻辑上都是和一个监视器相关联的。
当对一个对象加了锁,就需要一个锁指向这个对象,锁有计数器,对这个对象进行监控。
锁住一个对象就是获取对象相关联的监视器。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2