论坛首页 Java企业应用论坛

关于synchronized的疑问

浏览 60684 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-04-09  
synchronized是为了保证同一时间某方法或程序只被一个线程调用,但有一点疑惑。是不是有可能被同一程序不同用户同时调用的方法或程序(关系到数据存储或session保存的)都应该使用上synchronized呢?
可能说的不太清楚,让我举个例子吧
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呢?
谁能解释解释?
   发表时间:2004-04-09  
这种同时使用是安全允许的,两个用户同时进入B(b).change(String name)不会产生令人不安的后果,因为他们做的事情setAttribute()不争夺资源,不产生矛盾。
0 请登录后投票
   发表时间:2004-04-09  
一般来说,我们用同步关键字的目的在于保障线程访问的安全,就你上面的来说,如果你的name属性会用来作为一个非常重要的(比如线程间的状态)判断,那么它需要描述成同步;还有一点,用同步会带来极大的性能下降,当一段代码会执行得非常快(比如就想你上面的赋值,时间几乎可以不计),其实根本可以不需要用同步描述的,当你的代码段比较长,并且相当重要,那么就会需要了。
0 请登录后投票
   发表时间:2004-04-09  
补充一点,用synchronized关键字一般基于以下几点:对于共享性并且需要独占(比如事务等)的资源、对于影响其他程序运行的状态才需要用它。
0 请登录后投票
   发表时间:2004-04-12  
其实如果照上面说的时间快就可以忽略不计的话,那么其实也不太可能真正存在那么多需要计算时间的线程吧?那么,多线程的控制是不是也不需要那么多呢?意思是说,真正需要使用线程的程序在一个系统中并不多。
为什么那么说呢?因为照我目前对线程的理解(其实根本还不理解,主要问题就是出现在同时这个概念,一直想不懂),同时的可能性是有的,但真的会有很多是同时的吗?其实大多数程序应该都是执行一段很小的时间吧?那么说,只有在非常复杂的数据读取和计算之类的时候才需要考虑线程(但如果是真的进行这样的数据操作,似乎控制用在数据库自己的控制还会比较好些,比如rollback())?
搞不懂,谁能说一说?
0 请登录后投票
   发表时间:2004-04-12  
我这样给你举例子吧!如果做一个web系统,你的客户访问量小于50,一般来说,是可以不考虑多线程的,因为他们出现并发的状况不是太多(当然,它存在隐患);如果你的系统访问超过了一定量,那就必须考虑并发情况了。
   再一个我们所说的执行时间比较短(是指在10ms级),如果超过了100ms级(这也是非常常见的),也有需要进行同步了。
   任何事情不能绝对的~~~~~~~~~~~~~~·
0 请登录后投票
   发表时间:2004-04-13  
容我再想想
始终觉得这不是一个容易把握的东西
-__-
0 请登录后投票
   发表时间: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 方法用的就是类锁.

如果说错啦,请指正(因为我也不是很明白,只是说出了我的了解,当时学习线程的时候,都快疯啦,也没有把书看完,好多的概念),谢谢
0 请登录后投票
   发表时间:2004-04-13  
引用

synchronized只是阻止不同线程访问资源的(在同一个线程是无效的)

应该这样说:java中的锁是可重入的。
0 请登录后投票
   发表时间:2004-04-13  
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/ReentrantWriterPreferenceReadWriteLock.html
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics