具体题目不记得了,大概实现:多线程中对某个共享的数据进行修改,保证线程安全,用内部类隐藏这些操作。
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
共识的数据已经被锁保护了