java开发工程师笔试题

1.当一个线程进入一个对象的一个synchronized方法时,其它线程是否可以同时进入此对象的其它方法? 请写出验证此问题的原代码。
答:不能,一个对象的一个synchronized方法只能由一个线程访问。

情况一:
当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。
代码如下:
package com.mutithreading.Object;
public class InvokedObject
{

public synchronized void synchronizedMethod()

{

System.out.println("Invoked synchronizedMethod !") ;

try {

Thread.sleep(10000) ;

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public void generalMethod()

{

System.out.println("Invoked generalMethod ...") ;

}

}


package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

public class ThreadOne implements Runnable {

private InvokedObject object ;

public ThreadOne(InvokedObject object)

{

this.object = object ;

}


public void run() {

object.synchronizedMethod() ;

}

}

package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

public class ThreadTwo implements Runnable {

private InvokedObject object ;

public ThreadTwo(InvokedObject object)

{

this.object = object ;

}

public void run() {

object.generalMethod() ;

}

}

package com.mutithreading.client;

import com.mutithreading.Object.InvokedObject;

import com.mutithreading.threads.ThreadOne;

import com.mutithreading.threads.ThreadTwo;

public class Client {

public static void main(String[] args) {

InvokedObject object = new InvokedObject() ;

ThreadOne one = new ThreadOne(object) ;

ThreadTwo two = new ThreadTwo(object) ;

Thread threadOne = new Thread(one) ;

Thread threadTwo = new Thread(two) ;

threadOne.start() ;

threadTwo.start() ;

}
}


运行结果:
[quote]一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。[/quote]

情况二:
当一个线程进入一个对象的一个synchronized方法后,其它线程也访问该同步方法。
package com.mutithreading.Object;

public class ThreadTwo implements Runnable {

private InvokedObject object ;

public ThreadTwo(InvokedObject object)

{

this.object = object ;

}

public void run() {

object.synchronizedMethod() ;

}

}

其它代码同情况一,运行结果:
[quote]一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。[/quote]

情况三:
当一个线程进入一个对象的一个synchronized方法后,其它线程同时访问该对象的另一个同步方法。
此处仅给出对InvokedObject类做出的修改代码:

package com.mutithreading.Object;

public class InvokedObject

{

public synchronized void synchronizedMethod1()

{

System.out.println("Invoked synchronizedMethod1 !") ;

try {

Thread.sleep(10000) ;

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public synchronized void synchronizedMethod2()

{
System.out.println("Invoked synchronizedMethod2 !") ;
}
}


运行结果:
[quote]一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。[/quote]
2.使用httpclient的默认配置向某中文站点提交中文内容后,通过web访问访问该站点发现提交的内容都变成了乱码,请分析产生乱码问题的可能原因,并给出相应的解决思路。

httpclient的默认配置向站点提交采用“get”方式,请求编码与接收编码不一致,导致页面出现乱码,或者编码不在此编码标准范围内。
解决思路:统一编码或者增加过滤器

Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
} catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}

3.假设存在一个服务器端的分配程序,它拥有包含足够多成员的数据池,当客户端的申请程序向分配程序发出请求时,分配程序会随机从池中分配一个空闲的成员(假设每个成员都有一个唯一标识,分配程序保证一个成员同时只会分配给唯一的申请程序),申请程序结束或再次申请时, 分配程序会自动将其上次申请的成员回收(置成空闲状态放入池中,这个数据成员就有机会被其它申请程序申请到)。

现在要求:
由你来设计一个客户端的申请程序,它连续多次执行申请、使用、释放成员的操作,并且该程序可能存在多个同时运行的实例,在指定时间区间内,每个实例每次都不能使用任一重复成员(申请到重复的成员时申请程序要放弃并重新申请),请描述一下你的实现方案。
如果该程序的多个实例不在同一计算机上运行,还需要考虑什么?

4.在Firefox浏览器内浏览下面页面:

<html>
<head>
<script language="javascript">
div_handle=function(e){
alert('div');
};
document_handle=function(e){
alert('document');
};
</script>
<head>
<body>
<div id='divclick'>click me</div>
<script language="javascript">
document.addEventListener('click',document_handle,true);
document.getElementById('divclick').addEventListener('click',div_handle,true);
</script>
</body>
</html>

当用户点击"click me"时,div_handle和document_handle哪个将被先执行?为什么?
先执行document_handle后div_handle,document_handle直接由document创建,当浏览器装入页面后立即触发,div_handle当浏览器装入document.getElementById('divclick')对象后立即触发
如果需要颠倒执行次序,最简单的修改方案是什么?
最简单的修改方案是:document.addEventListener('click',document_handle,false),将true改为false,事件捕获阶段div_handle函数先触发,而事件冒泡阶段document_handle后触发

5.页面加载时OnDomReady和OnLoad那个事件先被触发,为什么?
OnDomReady事件先被触发
OnDomReady:当浏览器执行到该行后立即触发。
OnLoad:当浏览器装入对象后立即触发。

6.请说明下面代码执行后提示"global"还是"local"?为什么?

var y = "global";
function factory() {
var y = "local";
return new Function("return y");
}
alert(factory()());

global,在全局函数factory()内重新反回一个新匿名函数,原有复写局部变量在新匿名函数中失效,它只对factory()复写,而不对factory()()复写。

7.简述cookie和session作用,区别和应用范围
cookie:表示在客户端创建一个cookie,用来存贮接收服务器的信息
session:表示一个请求的javax.servlet.http.HttpSession对象,Session可以存贮用户的状态信息
cookie:范围是一直存活在整个程序中,当用户将cookie清除时就失效
Session:范围是用户和服务器连接的那段时间,用户与服务器断开属性就失效

8.提供一段代码演示闭包

<script>
//创建Person函数
function Person()
{
//locVal是个局部变量,原本应该该函数结束后立即失效
var locVal = '疯狂Java联盟';
this.info = function()
{
//此处会形成闭包
document.writeln("locVal的值为:" + locVal);
return locVal;
}
}
var p = new Person();
//调用p对象的info()方法
var val = p.info();
//输出val返回值,该返回值就是局部变量locVal。
alert(val);
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值