简单东西-面试经历总结

    最近两周找工作,面试过程中碰到一些比较有深度的提问,现在整理整理,也是学习的过程。

布式环境下java的同步机制失效如何是好

    我们知道java中的锁同步机制,是应用层面的,只对当前应用有效,所以对共享成员变量的同步处理在单个应用中有效。但是如果涉及到集群部署的环境,那么单个应用中的锁同步机制不是就失效了吗?那么共享变量该怎么处理呢?这是面试过程中遇到的第一个由深度的问题:分布式网站中,一件货品的数量是1,那么怎么保证最终只能有一个客户能够成功下单、抢购得到该商品呢?我当时的想法是,从应用层面来说,商品的数量就不能是应用层面共享的变量的,锁同步机制失效了,那么久需要用分布式锁管理。这个商品的数量应该从数据库中获取,使用分布式数据库锁,保证只能有一个线程能够正确完成写操作。

Tomcate重启过程中如何保证Session也能被恢复

    这个问题是一家专注金融产品的单位的面试官提出的,他问在生产环境下,如何保证Tomcat重启过程中,让用户感受不到宕机操作。这个是实际开发中可能会遇到的常见,我一直都是小打小闹做的项目,对服务器重启这种事司空见惯,也从来没有考虑过重启服务器对用户的影响。这个问题的本质就是Tomcate的Session持久化的配置问题,tomcate提供了Session持久化的两种策略,一种是存储到本地文件,还有一种就是存储到数据库。

统计一天中每一秒同时在线的用户的数量

    需求描述是这样的,有一个日志文件,格式为:时间戳  用户Id 用户操作(IN/OUT)记录一天中不同时刻用户的操作,然后需要统计每一秒同时在线的用户总数量。我开始想到的是用Map,以每一秒为key来统计,后来怎么都说不通顺,理不清这个思路。面试官给出的答案是直接使用数组,数组的每一个元素代表某一秒的同时在线的用户总数,而且下一秒在线的用户总数的统计可以直接依赖上一个元素在遍历文件过程中就可以完成统计过程。

    它一说出来我就恍然大悟,这不就是利用数组统计26个字母出现的次数么?定义一个数组,每个数组代表一个字母的出现次数,统计过程中直接在遍历过程中将某个字符累加到对应的数组元素上就完成统计了。

    言归正传,这个统计同时在线用户总数的过程,大概思路是这样的,可以定义一个大大的数组,数组长度为一天的总秒数,以统计当天每一秒同时在线用户数。然后再遍历文件,根据用户的操作记录(登入/登出)来修正数组元素的值,可以将登入操作用数值1表示,登出操作用数值-1表示,然后统计当前这一秒同时在线人数=上一秒值+当前记录的操作对应的数值。大概的实现伪代码如下:

public class UserOnline{
	private int [] onlineArray;
	private String fileName;
	private final long seconds = 24*60*60;
    
	public UserOnline(String fileName){
		if(fileName==null||"".equals(fileName)){
			return ;
		}
		this.fileName = fileName;
		onlineArray = new int[seconds];
	}
	
	public void statistic(){
		//遍历文件每一秒在线用户数
		while(true){
			String content = reader.readLine();
			Record record = parse(content);
			int time = record.getTime();
			int action = record.getAction();
			onlineArray[time]=onlineArray[time]+action;
		}
		
	}
	
	private  Record parse(String content){
		String[] temp = content.split(" ");
		int time = temp[0];
		int action = "IN".equals(temp[2])?1:-1;
		Record record = new Record(time,action);
		return record;
	}
	
	
}

public class Record{
	private int time;
	private int action;
	
	public Record(int time,int action){
		this.time = time;
		this.action = action;
	}
	
	public int getTime(){
		return time;
	}
	
	public int getAction(){
		return action;
	}
}
    简单记录,也是面试中意外的学习收获吧!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值