锁定老帖子 主题:关于synchronized的疑问
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-04-09
可能说的不太清楚,让我举个例子吧 public class A { void changeSession(String name); { B.change(name);; } } pubilc class B{ void change(String name);{ session.setAttribute("name",name);; } } 那么,当有两个用户都会使用到A来changeSession的时候,B里面的change就有可能被两个A同时使用了,象这样的情况,是否应该加上synchronized呢? 谁能解释解释? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-04-09
这种同时使用是安全允许的,两个用户同时进入B(b).change(String name)不会产生令人不安的后果,因为他们做的事情setAttribute()不争夺资源,不产生矛盾。
|
|
返回顶楼 | |
发表时间:2004-04-09
一般来说,我们用同步关键字的目的在于保障线程访问的安全,就你上面的来说,如果你的name属性会用来作为一个非常重要的(比如线程间的状态)判断,那么它需要描述成同步;还有一点,用同步会带来极大的性能下降,当一段代码会执行得非常快(比如就想你上面的赋值,时间几乎可以不计),其实根本可以不需要用同步描述的,当你的代码段比较长,并且相当重要,那么就会需要了。
|
|
返回顶楼 | |
发表时间:2004-04-09
补充一点,用synchronized关键字一般基于以下几点:对于共享性并且需要独占(比如事务等)的资源、对于影响其他程序运行的状态才需要用它。
|
|
返回顶楼 | |
发表时间:2004-04-12
其实如果照上面说的时间快就可以忽略不计的话,那么其实也不太可能真正存在那么多需要计算时间的线程吧?那么,多线程的控制是不是也不需要那么多呢?意思是说,真正需要使用线程的程序在一个系统中并不多。
为什么那么说呢?因为照我目前对线程的理解(其实根本还不理解,主要问题就是出现在同时这个概念,一直想不懂),同时的可能性是有的,但真的会有很多是同时的吗?其实大多数程序应该都是执行一段很小的时间吧?那么说,只有在非常复杂的数据读取和计算之类的时候才需要考虑线程(但如果是真的进行这样的数据操作,似乎控制用在数据库自己的控制还会比较好些,比如rollback())? 搞不懂,谁能说一说? |
|
返回顶楼 | |
发表时间:2004-04-12
我这样给你举例子吧!如果做一个web系统,你的客户访问量小于50,一般来说,是可以不考虑多线程的,因为他们出现并发的状况不是太多(当然,它存在隐患);如果你的系统访问超过了一定量,那就必须考虑并发情况了。
再一个我们所说的执行时间比较短(是指在10ms级),如果超过了100ms级(这也是非常常见的),也有需要进行同步了。 任何事情不能绝对的~~~~~~~~~~~~~~· |
|
返回顶楼 | |
发表时间:2004-04-13
容我再想想
始终觉得这不是一个容易把握的东西 -__- |
|
返回顶楼 | |
发表时间:2004-04-13
线程本身就是一个很大的学问.
synchronized只是阻止不同线程访问资源的(在同一个线程是无效的) 例如: class Test{ public synchronized void A();{ B();; .... } public synchronized void B();{ A();; .... } public static void main(String[] args);{ new Test();.B();; } }是不会死锁的(不过小心进入死循环); 在java中有对象锁和类锁(这个不知道是否这样讲). 例如: 非静态的synchronized 方法用的就是对象锁. 静态的 synchronized 方法用的就是类锁. 如果说错啦,请指正(因为我也不是很明白,只是说出了我的了解,当时学习线程的时候,都快疯啦,也没有把书看完,好多的概念),谢谢 |
|
返回顶楼 | |
发表时间:2004-04-13
引用 synchronized只是阻止不同线程访问资源的(在同一个线程是无效的) 应该这样说:java中的锁是可重入的。 |
|
返回顶楼 | |
发表时间:2004-04-13
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/ReentrantWriterPreferenceReadWriteLock.html
|
|
返回顶楼 | |