积累了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类型所具有的位数呢?谢谢大牛指教 小菜我学习一下
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类型所具有的位数呢?谢谢大牛指教 小菜我学习一下
在显示以后 手动到数据库里加一条记录 这时刷新页面 并没有看到新增加的数据 。 只有把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);
当多线程操作的是同一个对象(即操作的是同一数据)时,调用对象的方法,而你的方法是申明的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的锁池,去等锁。。
吃饭了再来回答你后面的问题。。
String str = "sdfdfddd\0123123";
System.out.println(str);
谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符
-----------------------里面的\0是结束 字符串是一这个做结尾的
我粗心把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.
第一个:你说的那些我知道 可是没有回答到我问的点上 可能是我没有表达清楚
synchronized(obj)
{.......} 这个同步块 要得到obj的锁才能进入 如果我在这个同步块被线程a执行之前调用了另一个方法b b并不是同步方法 并把obj传为参数 传了进去
这时 我在b方法里对这个obj做什么操作 就算是得到了对象的锁 使的那个线程a不能进入同步块? 你说的进入synchronized修饰的方法就会得到锁
和没说一样嘛 对不?
第二个:save时覆盖了原来的数据 没有说清楚啊 要是save都能更新了还要update干什么
第四个: 我知道 \ 是转义字符 我也并不是想原样输出 只是在学C语言的时候 \0 是字符串截断用的 我就是想试试在java里它是什么意思
不知道为什么输出会换行 而且少输出了012
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()操作。
我粗心把update写成了save 结果发现居然也更新了 而且数据库里没有出现也没有新增加一条记录 这是咋回事? 不知道是不是和上面的情况一样。
String str = "sdfdfddd\0123123";
System.out.println(str);
谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符
由于\是转义字符,而\后接一到三位八进制的数,可表示ASCII中相应的字符,而\012是换行字符,所以
输出结果为sdfdfddd
3123第五题的理解是:使用update方法时,该方法中的参数要为持久化对象,或者脱管对象。你可以看一下Hibernate的帮助文档。
--> 移位操作符操作的运算对象是二进制的“位”,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
在显示以后 手动到数据库里加一条记录 这时刷新页面 并没有看到新增加的页面 。 只有把tomcat重起以后 再刷新 才能看到
这是为啥 宝宝说可能是Hibernate缓存? 我个人认为不是缓存的问题,我想hibernate的缓存做的不是那么差的。
试着从自己的程序找原因,你的刷新操作有没有触发这个hibernate的查询操作呢?另一种可能会是IE的缓存的原因,意思就是当你刷新的时候IE并不去服务器重新取数据,但我还是觉得这
种可能性很小。
输出结果为sdfdfddd
3123 ===============================================
是不是还有表示其他相关操作的字符呢?
\n 后面的n是不是char型,和\一起就成了换行符?
和Server ser = new Server(); 建的一个对象 程序怎么 知道哪个是和Session关联的而哪个又不是呢? 谢谢回答!@
第一个:你说的那些我知道 可是没有回答到我问的点上 可能是我没有表达清楚
synchronized(obj)
{.......} 这个同步块 要得到obj的锁才能进入 如果我在这个同步块被线程a执行之前调用了另一个方法b b并不是同步方法 并把obj传为参数 传了进去
这时 我在b方法里对这个obj做什么操作 就算是得到了对象的锁 使的那个线程a不能进入同步块? 你说的进入synchronized修饰的方法就会得到锁
和没说一样嘛 对不? 不知道你到底问的什么?你写个例子?对象的得锁与不得锁 说白了就是和其他同步线程之间的通信,你最好写个例子,或者说个具体实现,直接说怎么得到对象的锁,很抽象
比如: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个线程不会产生阻塞状态。不知道说没说没明白,是不是你要所表达的意思
和Server ser = new Server(); 建的一个对象 程序怎么 知道哪个是和Session关联的而哪个又不是呢? 谢谢回答!@
######################################################################这个是hibernate的事情.
你通过session得到的对象就是和session关联的了,由hibernate控制的.
new()出来的对象就是还没关联,因为你没涉及到hibernate操作.
update的确是要与session关联才可以的。new()出来的对象是没有关联,但是只要设置了ID,执行update方法时hibernate会去检查数据库是否有此ID的数据,如果有就会执行update方法。
你出错的可能会不会是没有得到ID?或者你设置了version,此时你要update的话必须要得到ID和version两个参数才能执行。
基本结构为: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都能执行!
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位就行了.
关于那个hibernate的问题,我有一些意见。
update的确是要与session关联才可以的。new()出来的对象是没有关联,但是只要设置了ID,执行update方法时hibernate会去检查数据库是否有此ID的数据,如果有就会执行update方法。
你出错的可能会不会是没有得到ID?或者你设置了version,此时你要update的话必须要得到ID和version两个参数才能执行。
*****************************************************************
你说的是对的。我的理解有误。
这些是由 Java 虚拟机规范所规定的。这样也就是说 >> 32 与 >> 0 的效果是一样的,因为 32 的二进制位是 100000,低 5 位是 00000,那就是 0 了。