面试时遇到的几个问题,大家来讨论啊
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; }
[解决办法]
[解决办法]
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; }}
[解决办法]
[解决办法]
不能用>>啊,负数就麻烦了,死循环了。
[解决办法]
对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目录下即可.
[解决办法]
------解决方案--------------------
忘记说明了 你那个第2题有点歧义
如果说是线程同步的方法应该就是 sychronized 和lock 这个区别就是 lock比sychronized有更精确的线程语义和更好的性能 stchronized会自动释放锁
lock 必须手动释放 必须在finally里面释放
如果说同步的几种实现方法 就应该是2种 一种是 sychronized 一种就是 wait()与notify()
[解决办法]
执行到一个main方法的时候创建一个jvm,
不同的webapp应该理解为是不同的main方法
所以应该是不同的jvm,
所以就算时static的也不能共享。
(个人见解)
[解决办法]
1.我原来以为可以...看了大家的回帖,才知道不可以.
2.除了sychronized,还有volatile变量可以控制同步.
[解决办法]
学习,对第三个问题编程试了下,结果是2,但不怎么懂,我是菜鸟,有高手具体解释下不?
[解决办法]
1. 不能. 原因不知道, 但实验证明, 不能
[解决办法]
[解决办法]
本人认为,不同的项目tomcat都为其创建一个类加载器(org.apache.catalina.loader.WebappClassLoader )的实例,不同的类加载器实例之间不能共享资源。。。
[解决办法]
[解决办法]