积累了N多问题 就等着今天呢。总算有100分了1.线程操作 。 怎么样才算得到了对象的锁呢? 是调用对象上的方法就会得到 还是怎么样?
2.Hibernate 更新数据 把主键和要更新的数据封装到了pojo里
   我粗心把update写成了save 结果发现居然也更新了 而且数据库里没有出现也没有新增加一条记录 这是咋回事?
3.用Hibernate对数据库进行查询 然后将结果保存在request到 forward到一个页面上去显示
    在显示以后 手动到数据库里加一条记录  这时刷新页面 并没有看到新增加的页面 。 只有把tomcat重起以后 再刷新 才能看到
   这是为啥  宝宝说可能是Hibernate缓存?4.
        String str = "sdfdfddd\0123123";
        System.out.println(str);
         谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符
5.Server ser = new Server();
  ser.setID(Integer.parseInt(request.getParameter("id")));
  ser.setTitle(request.getParameter("title"));
  ser.setContent(request.getParameter("content"));
  session.update(ser);   上面这些代码 对数据表进行更新 Server是一个pojo 
    结果发现并没有对原始记录进行更新 也是另外新加了一条记录。 
    这是咋回事呢? 
   不过我换成这样就能正常更新了:
   Server ser = session.get(Server.class,request.getParameter("id"));
     ser.setID(Integer.parseInt(request.getParameter("id")));
  ser.setTitle(request.getParameter("title"));
  ser.setContent(request.getParameter("content"));
  session.update(ser);6. 在做一个swing小东西时发现的问题 
    界面上有50多个JLabel 我要循环设置每个JLabel的Text属性的值 。
   难道 要把每个label都加到集合里 然后再循环吗 这样是不是太麻烦 如果是上百个咋办呢? 有什么方法能方便一点呢? 好像用反射可以做到? 7.Java编程思想上写到:<< 只有对数值右端的5位才有用 这样可以防止我们移位超过int类型所具有的位数
   这句话是什么意思啊。/ 为什么超过5位就会超过int类型所具有的位数呢?谢谢大牛指教  小菜我学习一下   

解决方案 »

  1.   

    打错了3.用Hibernate对数据库进行查询 然后将结果保存在request里 forward到一个页面上去显示 
        在显示以后 手动到数据库里加一条记录  这时刷新页面 并没有看到新增加的数据 。 只有把tomcat重起以后 再刷新 才能看到 
       这是为啥  宝宝说可能是Hibernate缓存? 5.Server ser = new Server(); 
      ser.setID(Integer.parseInt(request.getParameter("id"))); 
      ser.setTitle(request.getParameter("title")); 
      ser.setContent(request.getParameter("content")); 
      session.update(ser);    上面这些代码 对数据表进行更新 Server是一个pojo  
        结果发现并没有对原始记录进行更新 而是另外新加了一条记录。  
        这是咋回事呢?  
       不过我换成这样就能正常更新了: 
       Server ser = session.get(Server.class,request.getParameter("id")); 
         ser.setID(Integer.parseInt(request.getParameter("id"))); 
      ser.setTitle(request.getParameter("title")); 
      ser.setContent(request.getParameter("content")); 
      session.update(ser); 
      

  2.   

    1.线程操作 。 怎么样才算得到了对象的锁呢? 是调用对象上的方法就会得到 还是怎么样?
    当多线程操作的是同一个对象(即操作的是同一数据)时,调用对象的方法,而你的方法是申明的Synchronizied的就得到了这个对象的锁
    这种最经典的就是生产者--消费者设计模式:
    例如://Depot.java
    public Depot{
        public synchronizied void add(){ //其实这里的Synchronizied的对象就是this,当以Depot的实例来构造的线
           if(什么条件){                  //程,调用该对象的add方法时,该对象就得到了锁,以Depot的同一实例来
              this.wait();               //构造的的其他线程就会在此对象的等待池或在锁池等等待;
           }
           .........
           this.notifyAll();    
        }
        public synchronizied dataType remove(){
           if(什么条件){
              this.wait(); 
           }
           .........
           this.notifyAll();
        }
    }//ThreadA.java
    public ThreadA extends Thread{  //以Depot的事例来构造线程
        private Depot d;
        
        public ThreadA(Depot d){
           this.d = d;
        }
        public void run(){
           d.add();
        }
    }//ThreadB.java
    public ThreadB extends Thread{
        private Depot d;
        
        public ThreadA(Depot d){
           this.d = d;
        }
        public void run(){
           d.remove();
        }
    }//Test.java
    public class Test{
        public static void main(String[] args){
           Depot d = new Depot();
           Thread a = new Thread(d);
           Thread b = new Thread(d);
           a.start();
           b.start();
        }
    }
    还有一种://ThreadTest.javapublic ThreadTest extends Thread{
         private static int i = 0;
         private Object obj = new Object();
         public void run(){
            while(i < 36){
                synchronizied(obj){
                .......................
                }
            }
         }
    }当生成多个ThreadTest后,多个线程共享数据和代码,但是obj是唯一的,所以只要运行时,某一个执行到while循环内后就得到的Obj的锁,其他线程要到obj的锁池,去等锁。。
    吃饭了再来回答你后面的问题。。
      

  3.   

    4. 
            String str = "sdfdfddd\0123123"; 
            System.out.println(str); 
             谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符 
    -----------------------里面的\0是结束  字符串是一这个做结尾的
      

  4.   

    2.Hibernate 更新数据 把主键和要更新的数据封装到了pojo里 
       我粗心把update写成了save 结果发现居然也更新了 而且数据库里没有出现也没有新增加一条记录 这是咋回事? 
       anser : save时覆盖了原来的数据
    3.不清楚,不断言。
    4.String str = "sdfdfddd\0123123"; 
      System.out.println(str); 
      谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符 
       
       String str = "sdfdfddd\0123123"; 中间的\在java是转义符号,记得\0在Java中代表null,不太清楚了
        如果要原样输出应该是String str = "sdfdfddd\\0123123"; 
       
    5.
      

  5.   

    to  sharpyuce  你回答的几个问题的答案我都不是太满意
    第一个:你说的那些我知道 可是没有回答到我问的点上 可能是我没有表达清楚
             synchronized(obj) 
              {.......}  这个同步块 要得到obj的锁才能进入 如果我在这个同步块被线程a执行之前调用了另一个方法b  b并不是同步方法 并把obj传为参数              传了进去
              这时 我在b方法里对这个obj做什么操作 就算是得到了对象的锁 使的那个线程a不能进入同步块? 你说的进入synchronized修饰的方法就会得到锁 
                和没说一样嘛 对不?
    第二个:save时覆盖了原来的数据  没有说清楚啊 要是save都能更新了还要update干什么  
    第四个: 我知道 \ 是转义字符 我也并不是想原样输出  只是在学C语言的时候 \0 是字符串截断用的 我就是想试试在java里它是什么意思
            不知道为什么输出会换行 而且少输出了012
      

  6.   

    5.Server ser = new Server();             // new()出来的对象,没和session关联,应该是保存
      ser.setID(Integer.parseInt(request.getParameter("id")));   //没和session关联,设置的id被忽略
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);     //其实是保存,一般不推荐这么做。保存就是保存,更新就该更新   上面这些代码 对数据表进行更新 Server是一个pojo 
        结果发现并没有对原始记录进行更新 也是另外新加了一条记录。 
        这是咋回事呢?            
       不过我换成这样就能正常更新了:
       Server ser = session.get(Server.class,request.getParameter("id"));   // 对象和session关联
         ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);   要记得什么是update(),就是从数据库里取出数据,修改,这样才能算更新。可以理解为你要更新的那个对象必须是
    和session关联的,请看红色注释。如果你的对象是new()出来的,它还没和session关联,那么对它的update()操作
    会被理解为保存save()操作。
      

  7.   

    2.Hibernate 更新数据 把主键和要更新的数据封装到了pojo里
       我粗心把update写成了save 结果发现居然也更新了 而且数据库里没有出现也没有新增加一条记录 这是咋回事? 不知道是不是和上面的情况一样。
      

  8.   

    4. 
            String str = "sdfdfddd\0123123"; 
            System.out.println(str); 
             谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符 
         由于\是转义字符,而\后接一到三位八进制的数,可表示ASCII中相应的字符,而\012是换行字符,所以
         输出结果为sdfdfddd
                 3123第五题的理解是:使用update方法时,该方法中的参数要为持久化对象,或者脱管对象。你可以看一下Hibernate的帮助文档。
      

  9.   

    回复第七个问题:
      --> 移位操作符操作的运算对象是二进制的“位”,int类型是32位也就是2的5次幂 !如果移32位以上,那么原来的数的信息会全部丢失,这样也就没有什么意义了!所以上面的“只有右侧的5个低位才会有用”说的是:移位操作符右端的那个数(化成二进制)的低5位才有用,即 
    X < <y; 
    是指y的低5位才有用,即不能大于32。 而对于long型也是同样的道理!因此,如果对一个int 型,进行移位,X < <y; 当y小于32时,移位后的结果一般都在我们的预料当中;而如果y大于32时,由于移位超出了int所能表示的范围,这时就先把y化成二进制数,然后取该二进制数右端的低5位,再把这5位化成十进制,此时的这个十进制就是要对X移动的位数。例如:         int int a=140;   
                         a << 34                    System.out.println(Integer.toBinaryString(a << b)); 上面那两个语句的执行过程是:先把a化成二进制数:10001100执行语句 a << 34   对a左移32位时,先把 34化成二进制:100010,对该二进制数取右边5位,即00010,化成十进制数为2,所以实际上是对a左移两位。现在,地球人都会知道上面程序的输出结果是:1000110000 
      

  10.   

    3.用Hibernate对数据库进行查询 然后将结果保存在request到 forward到一个页面上去显示
        在显示以后 手动到数据库里加一条记录  这时刷新页面 并没有看到新增加的页面 。 只有把tomcat重起以后 再刷新 才能看到
       这是为啥  宝宝说可能是Hibernate缓存? 我个人认为不是缓存的问题,我想hibernate的缓存做的不是那么差的。
    试着从自己的程序找原因,你的刷新操作有没有触发这个hibernate的查询操作呢?另一种可能会是IE的缓存的原因,意思就是当你刷新的时候IE并不去服务器重新取数据,但我还是觉得这
    种可能性很小。
      

  11.   

    别的问题这么多 我懒的看,一眼看到最后一个了 记得我以前看过 就粗略说说:移位操作符操作的是位,你把两端的数以二进制的形式来运算。低5位是指移位符号右侧二进制码的5个低位。因为2的5次方是32,也就是说5个低位最大可表示为32,也就是最大可以移32位。而int型只有32位。5个低位就够用了。所以“右端的低5位才有用”。。不知道这样解释是否明了?
      

  12.   

        由于\是转义字符,而\后接一到三位八进制的数,可表示ASCII中相应的字符,而\012是换行字符,所以 
         输出结果为sdfdfddd 
                 3123 ===============================================
    是不是还有表示其他相关操作的字符呢?
    \n 后面的n是不是char型,和\一起就成了换行符?
      

  13.   

    最后一个问题已经明白 谢谢大家的回答 特别是wushui1215 和 johnsoncr 请大家接着帮忙回答一下别的问题哈。 特别是Hibernate的问题Server ser = session.get(Server.class,request.getParameter("id"));   // 对象和session关联 我这样得到一个对象 
    和Server ser = new Server(); 建的一个对象 程序怎么 知道哪个是和Session关联的而哪个又不是呢? 谢谢回答!@
      

  14.   

    to  sharpyuce  你回答的几个问题的答案我都不是太满意 
    第一个:你说的那些我知道 可是没有回答到我问的点上 可能是我没有表达清楚 
             synchronized(obj)  
              {.......}  这个同步块 要得到obj的锁才能进入 如果我在这个同步块被线程a执行之前调用了另一个方法b  b并不是同步方法 并把obj传为参数               传了进去 
              这时 我在b方法里对这个obj做什么操作 就算是得到了对象的锁 使的那个线程a不能进入同步块? 你说的进入synchronized修饰的方法就会得到锁  
                和没说一样嘛 对不? 不知道你到底问的什么?你写个例子?对象的得锁与不得锁  说白了就是和其他同步线程之间的通信,你最好写个例子,或者说个具体实现,直接说怎么得到对象的锁,很抽象
      

  15.   

    不知道你上面说的是不是这种同步:
    比如:class A{
       public synchronizied void m1(){
           ................
       }
      
       private Object object = new Object();   public void  m2(){
           synchronizied(object){}   
       } 
    }class ThreadA extends Thread{
        private A a;
        
        public ThreadA(A a){
           this.a = a;    
        }
        public void run(){
           a.m1();
        }
    }public class TestThread{
        public static void main(String[] args){
           A a = new A();
           
           Thread t = new ThreadA(a);
           t.start();
           a.m2();
        }}上面的这种情况m1和m2这2个方法虽然是同步的,但是他们的锁不同,m1得到的是A的一个类对象(实例)的锁,而m2则是的到的synchronizied(object),object的锁,他们2个的同步是独立的,这中情况下,这2个线程不会产生阻塞状态。不知道说没说没明白,是不是你要所表达的意思
      

  16.   

    特别是Hibernate的问题Server ser = session.get(Server.class,request.getParameter("id"));   // 对象和session关联 我这样得到一个对象 
    和Server ser = new Server(); 建的一个对象 程序怎么 知道哪个是和Session关联的而哪个又不是呢? 谢谢回答!@
    ######################################################################这个是hibernate的事情.
    你通过session得到的对象就是和session关联的了,由hibernate控制的.
    new()出来的对象就是还没关联,因为你没涉及到hibernate操作.
      

  17.   

    关于那个hibernate的问题,我有一些意见。
    update的确是要与session关联才可以的。new()出来的对象是没有关联,但是只要设置了ID,执行update方法时hibernate会去检查数据库是否有此ID的数据,如果有就会执行update方法。
    你出错的可能会不会是没有得到ID?或者你设置了version,此时你要update的话必须要得到ID和version两个参数才能执行。
      

  18.   

    问题1::旧版本的jdk有synchronized关键字,jdk1.5用ReentrantLock类
    基本结构为:import java.util.concurrent.locks.*;
    //......public static void main(String[] args) {
    // ......
    Lock myLock=new ReentrantLock();
    myLock.lock();
    try{
    //critical section;
    }
    finally{
    myLock.unlock();
    }
    //.....
    最好用finally这样unlock都能执行!
      

  19.   

    楼主的知识真全面,按自己的理解说说,不对之处,莫怪...
    5.Server ser = new Server();
      ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);   上面这些代码 对数据表进行更新 Server是一个pojo 
        结果发现并没有对原始记录进行更新 也是另外新加了一条记录。 
        这是咋回事呢? 
       不过我换成这样就能正常更新了:
       Server ser = session.get(Server.class,request.getParameter("id"));
         ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser); 
    hibernate 每一个对象对应数据库中一条数据,你新实例化一个对象当然是新建立了一条数据.6. 在做一个swing小东西时发现的问题 
        界面上有50多个JLabel 我要循环设置每个JLabel的Text属性的值 。
       难道 要把每个label都加到集合里 然后再循环吗 这样是不是太麻烦 如果是上百个咋办呢? 有什么方法能方便一点呢? 好像用反射可以做到?
     
     
    呵呵 楼主一说循环,我的第一反映就是for循环,假设50个JLabel,把JLabel命名为jlabel1....jlabel50
    for(int i=1;i<51;i++)
    {
      ....
    }

    7.Java编程思想上写到: < < 只有对数值右端的5位才有用 这样可以防止我们移位超过int类型所具有的位数
       这句话是什么意思啊。/ 为什么超过5位就会超过int类型所具有的位数呢? 
    楼上的已经说的很明白了,我只是想补充一下,其实不用像楼上那样转来转去的,直接用移位数对32取模就行了,比如要移34位,34%32 结果是2,就移2位就行了.
      

  20.   

    update()这个方法生成的update的SQL语句。它只能用于持久化的对象和游离状态的对象。而server ser=new server(); 这个ser是自由状态的,它不能用update,只能用save()方法或者saveOrUpdate()方法。
      

  21.   

    pc_wang说到:
    关于那个hibernate的问题,我有一些意见。
    update的确是要与session关联才可以的。new()出来的对象是没有关联,但是只要设置了ID,执行update方法时hibernate会去检查数据库是否有此ID的数据,如果有就会执行update方法。
    你出错的可能会不会是没有得到ID?或者你设置了version,此时你要update的话必须要得到ID和version两个参数才能执行。
    *****************************************************************
    你说的是对的。我的理解有误。
      

  22.   

    12 楼的 wushui1215 说得很对在移位运算操作中 int 类型只取操作数的低5位(二进制),而 long 类型只取操作数的低6位(二进制)
    这些是由 Java 虚拟机规范所规定的。这样也就是说 >> 32 与 >> 0 的效果是一样的,因为 32 的二进制位是 100000,低 5 位是 00000,那就是 0 了。