一个JAVA面试题

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值