请写出一段java代码实现线程锁

2014-03-11 06:30:04 阅读( 3 )

2464人 收藏本页

标签:Java面试题

代码如下:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
public class Test {
public static void main(String args[]){
Aaa aaa = new Aaa(“ddd”);
Thread t1 = new Thread(aaa);
t1.start();
aaa.ccc();
}
}
class Aaa implements Runnable{
private static final long serialVersionUID = 1L;
private static Date maindate = new Date();
private static String name;
public Aaa(String str){
name = str;
}
public void setName(String changeName){
log(“————”+changeName);
name = changeName;
}
public void run(){
try {
Thread.sleep(1);
Method method = this.getClass().getMethod(name, null);
if(method != null){
method.invoke(this, null);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 通过同步方法锁定同步
* 这种方式的同步是锁定 this
* 也就是同一个实例中的所有同步方法或 this 为锁的同步代码块都同时被一个线程锁定
*/
public synchronized void aaa(){
log(“aaa 进入方法 “+name);
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
log(“aaa 退出方法 “+name);
}
/**
* 通过同步代码块锁定同步
* 如果同步代码块使用的锁是 this
* 则同一个实例中的所有方法同步或者 this 为锁的同步代码块都同时被一个线程锁定
*/
public void bbb(){
log(“bbb 进入方法 “+name);
synchronized(this){
log(“bbb 进入同步 “+name);
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
log(“bbb 退出方法 “+name);
}
}
/**
* 方法同步锁的另一种表述形式
*/
synchronized
public void ccc(){
log(“ccc 进入方法 “+name);
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
log(“ccc 退出方法 “+name);
}
/**
* 静态同步方法,与 this 锁定和同步方法锁定互不干涉
* 但是对于同一个类的不同静态同步方法是相互锁定状态的
*/
public static synchronized void ddd(){
log(“ddd 进入方法 “);
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
log(“ddd 退出方法 “);
}
private static void log(String str){
Date date = new Date();
if(date.getTime()-maindate.getTime()>500){
System.out.println(“——————————————–”);
}
maindate = date;
System.out.println(“["+date.getTime()+"]“+str);
}
}

来自IT公司面试手册

下一篇:什么是回调方法?java如何实现回调方法

上一篇:介绍一下SimpleDateFormat的用法

亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

您想查看更多的信息: 面试题