1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。2、请列举出java用于线程同步的各种技术(如synchronized关键字),说出他们的区别。3、写一个函数计算一个32位整数中有多少Bit位为1public int countBits(int value){}
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。2、请列举出java用于线程同步的各种技术(如synchronized关键字),说出他们的区别。3、写一个函数计算一个32位整数中有多少Bit位为1public int countBits(int value){}
还有一个synchronized block是用来解决第三方提供的方法与属性的同步问题的
还是用了synchronized关键字啊,有没有不用synchronized的技术呢?
public int countBits(int value){
int count=0;
while(value!=0){
count+=value&1;
value>>>=1;
}
return count;
}
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;
}
至于区别还是查一查吧
如果给出写好的bits32的话,直接通过bits32[value&0xffffffff]就可以得出来,这样应该是效率最快。
一个类的静态变量不可以在同一个WebServer中的多个WebApp中共享的吧。
因为不同的WebApp有不同的逻辑,如果其中一个WebApp改变了这个变量势必会影响到其的WebApp,这样所造成的结果是无法预见的。
这是从逻辑上来分析,那么从技术的角度应该怎么分析呢?哪位大虾有好的想法?
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;
}
}
一个类的静态变量在整个JVM环境下只有一个实例,同一个WEBSERVER使用的肯定是同一个JVM,所以在该JVM下所有的应用访问的是同一个值。
好像能不能共享是private,public...等东西来确定的吧。和static什么关系。
创建一个web项目test,写一个类 test.Test.javapackage test
public class Test{
public static String TEST = null;
}
test.jsp<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="test.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head><body>
<%
if(Test.TEST == null){
Test.TEST = new java.util.Date().toString();
}
out.println(Test.TEST);
%></body>
</html>
然后把它作为两个项目布暑到tomcat中,一个是test1,一个是test2,分别运行它们,最终得到的打印结果是不一样的,说明两个项目中的 Test.TEST 有值不同,故不能共享!
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
既然不是由同一个类装载器载入的,肯定不可以共享。但是,在同一个类装载器内部,
应该只有一个静态变量。
2.synchronized wait和notify()
3.
正解,这个题目太高深了,即要理解static的访问原理,又要裂解tomcat的类装在机制。这2个知识点没有深如学习都是接触不到。想问楼主面试什么职位,面试问题如此高深。
如果说是线程同步的方法应该就是 sychronized 和lock 这个区别就是 lock比sychronized有更精确的线程语义和更好的性能 stchronized会自动释放锁
lock 必须手动释放 必须在finally里面释放
如果说同步的几种实现方法 就应该是2种 一种是 sychronized 一种就是 wait()与notify()
我面试的是资深java软件工程师1W以上的职位
不好意思,刚才引用错了,我面试的是资深java软件工程师,1W以上的职位。
不同的webapp应该理解为是不同的main方法
所以应该是不同的jvm,
所以就算时static的也不能共享。
(个人见解)
2.除了sychronized,还有volatile变量可以控制同步.
static int getResult(int n){
int count = 0;
while(n != 0){
count ++;
n = n & (n-1);
}
return count;
}
编程之美
tomcat 6.0 下没有 shared 目录了
没有就放common/classes下面.
如果不能共享,目录名就没必要叫common,shared了.
1.可以,静态变量在一个WebApplication中应该只有一份
2.synchronized,notify,sleep,waited
3.