读书人

面试时遇到的几个小问题大家来讨论

发布时间: 2012-01-20 18:53:53 作者: rapoo

面试时遇到的几个问题,大家来讨论啊

1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。

2、请列举出java用于线程同步的各种技术(如synchronized关键字),说出他们的区别。

3、写一个函数计算一个32位整数中有多少Bit位为1

public int countBits(int value){

}

[解决办法]
2.synchronized有两中实现方法吧,一个是在方法或属性前加关键字
还有一个synchronized block是用来解决第三方提供的方法与属性的同步问题的
[解决办法]
3、

Java code
    public int countBits(int value){         int count=0;        while(value!=0){            count+=value&1;            value>>>=1;        }        return count;    }
[解决办法]
3、这个更高效
Java code
    public int countBits(int value){         int count=0;        int[] bits4={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};        while(value!=0){            count+=bits4[value&0xf];            value>>>=4;        }        return count;    }
[解决办法]
探讨
3、这个更高效
Java codepublicint countBits(int value){int count=0;int[] bits4={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};while(value!=0){
count+=bits4[value&0xf];
value>>>=4;
}return count;
}

[解决办法]
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。

静态变量是JVM级别的,所以能在同一个WebServer中的多个WEBAPP中共享
[解决办法]
Java code
public class Test{    public static void main(String[] args) {        System.out.println(countBits(3));    }    public static int countBits(int countValue){        int count=0;        while (countValue!=0) {            ++count;            countValue=countValue>>1;        }        return count;    }}
[解决办法]
探讨
引用:
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。

静态变量是JVM级别的,所以能在同一个WebServer中的多个WEBAPP中共享


一个类的静态变量不可以在同一个WebServer中的多个WebApp中共享的吧。
因为不同的WebApp有不同的逻辑,如果其中一个WebApp改变了这个变量势必会影响到其的WebApp,这样所造成的结果是无法预见的。
这是从逻辑上来分析,那么从技术的角度应该怎么分析呢?哪位大虾有好的想法?

[解决办法]
不能用>>啊,负数就麻烦了,死循环了。
[解决办法]
对wxwyes的例子的一点补充:
package test;
public class Test{
public static final int a=0;
public Test(){
System.out.println(Test.class.getClassLoader().getClass().getName());
}
}
jsp中引用的时候:
<%
out.println(new test.Test().a
%>
在构造函数中把类装载器打印出来。
结果发现,当放在tomcat的lib目录下面的时候,打印:org.apache.catalina.loader.StandardClassLoader
当放在某一个工程下面的classes下面的时候,打印:
org.apache.catalina.loader.WebappClassLoader
既然不是由同一个类装载器载入的,肯定不可以共享。但是,在同一个类装载器内部,
应该只有一个静态变量。
[解决办法]
1.是可以共享的.

以tomcat为例,它支持多个层次的类加载器.其中有shared类型加载器,其加载的类在所有webapps下的项目都可见.

把类的class文件放在shared/classes目录下即可.
[解决办法]
探讨
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。

2、请列举出java用于线程同步的各种技术(如synchronized关键字),说出他们的区别。

3、写一个函数计算一个32位整数中有多少Bit位为1

public int countBits(int value){

}

------解决方案--------------------


忘记说明了 你那个第2题有点歧义
如果说是线程同步的方法应该就是 sychronized 和lock 这个区别就是 lock比sychronized有更精确的线程语义和更好的性能 stchronized会自动释放锁
lock 必须手动释放 必须在finally里面释放
如果说同步的几种实现方法 就应该是2种 一种是 sychronized 一种就是 wait()与notify()
[解决办法]
执行到一个main方法的时候创建一个jvm,
不同的webapp应该理解为是不同的main方法
所以应该是不同的jvm,
所以就算时static的也不能共享。
(个人见解)
[解决办法]
1.我原来以为可以...看了大家的回帖,才知道不可以.
2.除了sychronized,还有volatile变量可以控制同步.

[解决办法]
学习,对第三个问题编程试了下,结果是2,但不怎么懂,我是菜鸟,有高手具体解释下不?
[解决办法]
1. 不能. 原因不知道, 但实验证明, 不能
[解决办法]

探讨
1.是可以共享的.

以tomcat为例,它支持多个层次的类加载器.其中有shared类型加载器,其加载的类在所有webapps下的项目都可见.

把类的class文件放在shared/classes目录下即可.

[解决办法]
本人认为,不同的项目tomcat都为其创建一个类加载器(org.apache.catalina.loader.WebappClassLoader )的实例,不同的类加载器实例之间不能共享资源。。。
[解决办法]
探讨
引用:
1.是可以共享的.

以tomcat为例,它支持多个层次的类加载器.其中有shared类型加载器,其加载的类在所有webapps下的项目都可见.

把类的class文件放在shared/classes目录下即可.


tomcat 6.0 下没有 shared 目录了

[解决办法]
探讨
引用:
引用:
1.是可以共享的.

以tomcat为例,它支持多个层次的类加载器.其中有shared类型加载器,其加载的类在所有webapps下的项目都可见.

把类的class文件放在shared/classes目录下即可.


tomcat 6.0 下没有 shared 目录了


没有就放common/classes下面.
如果不能共享,目录名就没必要叫common,shared了.

读书人网 >J2SE开发

热点推荐