1、我有一个单例的类,里面有一个方法m,m这个方法要执行很长时间,现在有1,2两个线程,假如1线程先去调用m方法,2线程也要去调用,2线程是等1线程调用完之后才去调用方法还是根据时间片1,2线程切换调用。
2、我有一个类,有一个成员变量:private HashTable ht;(hashtable是线程安全的),现在有两个方法a,b。
a方法中有一行读取变量ht的代码,b方法中有一行对ht修改的代码,
现有两个线程1,2,1去调用a,2去调用b。
当a方法先被调用但还没有执行到对ht读取的代码,这时候b方法被2线程调用并执行到修改ht那一行代码。此时会出现什么情况,是等待 还是别的

解决方案 »

  1.   

    1.如果两线程没有同步语句块的化,应该是时间片;否则假如A在执行同步语句块时,B也到达,那么B会等待A结束同步语句执行后,B再进入同步语句块执行
    2.由于是ht私有,所以两线程无关,各自做各自的ht
      

  2.   

    单例?
    是指A和B由同一个方法取同一个的对象,还是A和B由同一个方法里面new出来的?
      

  3.   

    表面看是两个线程,其实还是一个程序
    java API 是这样说的,一个线程start之后,再次start是没用的。所以表面看是两个,其实还是一个线程在跑。
    所以是没问题的
      

  4.   

    1问题现在明白了,但是又牵扯另一个问题:
    假如说现在有一个
    public void a(String userName){
         User user = new User();
         user.setUserName(userName);
        for(int i= 0;i<10000000;i++){
           
        }
        System.out.println(user.getUserName());
    }此时有两个线程1,2当1线程(传入“111”)将要执行完for循环的时候,
    2线程(传入“222”)执行了 user.setUserName(userName);此时1线程打印什么内容
    请详细说下原理,谢谢
    是否User user = new User();两个线程new出的user对象被分别存在1,2线程中(threadLocal)
      

  5.   

    这两个线程的user是不影响的,因为User对象都是在该线程中new出来的属于内部对象而需要注意的是,线程中的静态变量的修改。这些修改需要同步语句块或者同步方法,让一个线程修改完成后再让另外一个线程修改。这样就保证了线程的安全。