一个JAVA面试题

来源:互联网 发布:淘宝买发票怎么搜 编辑:程序博客网 时间:2024/06/04 19:01

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

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() {@Overridepublic 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() {@Overridepublic 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

共识的数据已经被锁保护了

0 0
原创粉丝点击