您的位置:首页 > 职场人生

一个JAVA面试题

2015-06-01 21:09 489 查看
具体题目不记得了,大概实现:多线程中对某个共享的数据进行修改,保证线程安全,用内部类隐藏这些操作。

package jav;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class FooBar{
private int i; // 多线程共享的数据
private ExecutorService exec; //多线程执行器
private Lock lock = new ReentrantLock(); //互斥锁
public FooBar() {
int i = 0;
exec = Executors.newCachedThreadPool();
}

/*模拟某个阻塞的操作*/
private void blocking(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public void shutdown(){
exec.shutdown();
}

public String toString(){
return "the value is :" + i;
}

public void syncIncrease(){
/*匿名内部类,隐藏多线程操作*/
exec.execute(new Runnable() {
@Override
public void run() {
lock.lock();//上锁
try{
System.out.println("starting increasing: " +i);
++i;
blocking();//阻塞在此处,增加临界区
++i;
System.out.println("increased: " + i);
} finally{
lock.unlock(); //释放锁
}
}
});
}

public void syncDecrease(){
/*匿名内部类,隐藏多线程操作*/
exec.execute(new Runnable() {
@Override
public void run() {
lock.lock();//上锁
try{
System.out.println("starting decreasing: " +i);
--i;
blocking();//阻塞在此处,增加临界区
--i;
System.out.println("decreased: " +i);
} finally{
lock.unlock();//释放锁
}
}
});

}

}

public class main {
public static void main(String[] args){

FooBar fb = new FooBar();
for (int i = 0; i < 5; ++i){
//对某个共享数据进行修改的两个操作,已经用内部类进行隐藏多线程
fb.syncIncrease();
fb.syncDecrease();
}

System.out.println("no blocking!");//立即返回
fb.shutdown();//清除处理
}

}

查看输出:

starting increasing: 0

no blocking!

increased: 2

starting decreasing: 2

decreased: 0

starting increasing: 0

increased: 2

starting decreasing: 2

decreased: 0

starting increasing: 0

increased: 2

starting decreasing: 2

decreased: 0

starting increasing: 0

increased: 2

starting decreasing: 2

decreased: 0

starting increasing: 0

increased: 2

starting decreasing: 2

decreased: 0

共识的数据已经被锁保护了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: