新足迹

 找回密码
 注册

精华好帖回顾

· 【魔头的2015年 第一季度 爱用品分享】 彩妆篇 (2015-5-7) 魔头 · 早教和child care 杂谈 (2012-7-14) aleeqian
· 超级无敌Sydney和Melbourne大对比(2)----Tertiary Education (2005-3-18) richstudio · 上学,放羊,补习,OC,精英, 基因等等 (2011-7-7) acoke
Advertisement
Advertisement
楼主:wangbo1118

[IT] 分享下银行招开发人员的第一轮题目 [复制链接]

头像被屏蔽

禁止发言

发表于 2014-8-8 11:10 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
piddock 发表于 2014-8-8 10:04
你说的实际上是增量垃圾收集方法,有的系统确实偏向于这种经常性的小暂缓,而尽量避免完全的停顿。

但 ...

是的,性能是下降的

他们针对性能的办法很粗暴,就是加硬件。。。据说能用钱解决的问题,都不是问题。。


这样的策略换取的只是避免完全停顿,哪怕是一小会儿的
Advertisement
Advertisement

发表于 2014-8-8 11:47 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
piddock 发表于 2014-8-8 10:10
OO并没有说要尽量减少建立不必要的Object,我的理解OO就是三个原则:继承、封装和多态。

相反,从软工 ...

"继承、封装和多态" 是OO的特性。用来判断是不是OO. 然后考虑OOA,OOD, OOP....每一个都有自己的原则。

我本科是计算机。也许年头久了,学的东西都变了。

发表于 2014-8-8 12:04 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 Bessy 于 2014-8-8 11:17 编辑
wangbo1118 发表于 2014-8-8 10:10
是的,性能是下降的

他们针对性能的办法很粗暴,就是加硬件。。。据说能用钱解决的问题,都不是问题。。 ...


呵呵,这样google 等就不需要花15万找个程序员去优化一台机器了。他们只要花5万找个程序员, 10万买10台机器。 10台机器怎么也要比1台机器搜索快啊。而且10台机器可以用好多年,可是程序员要每月都发工资。

因为CPU的单线程不够快,才有多线程。 因为单个大型机的性能不够,才有分布式。有多线程了就有了锁的问题。有分布式了就有了CAP的trade off. 就可以创造工作机会了。
头像被屏蔽

禁止发言

发表于 2014-8-8 21:03 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
piddock 发表于 2014-8-8 10:10
OO并没有说要尽量减少建立不必要的Object,我的理解OO就是三个原则:继承、封装和多态。

相反,从软工 ...

恩,你说的这个描述比较符合我想表达的意思

前面Bessy兄回帖里的:

“删除的Object, 立刻又被重新建立,这个逻辑上都说不通。”


估计是被我的表达搞糊涂了



我的意思是说,很多时候,会选择短生命周期的对象

比如,可以不用全局的,就不用全局,可以申明在方法里的变量,就不申明在类里面


前面所谓的建立对象又删除又建立,就是这种在方法里建立的对象吧,方法结束了,就没了,再被调用,又建立了
头像被屏蔽

禁止发言

发表于 2014-8-8 21:37 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 11:04
呵呵,这样google 等就不需要花15万找个程序员去优化一台机器了。他们只要花5万找个程序员, 10万买10台 ...


优化的价值会根据系统的规模变化啊

对于google这样大规模的系统,能有5%的改进,可能就意味着减少5%的硬件投资,如果总量巨大,那这个成本相对工程师就合算啊

系统规模小的时候,策略可能就不一样啊

有多线程是因为想并行处理任务

分布式系统的动力是因为省钱,早些年是可以花两倍的钱,买四倍性能的大机器的,所以那个时候都倾向买大机器,但是后来随着个人电脑的普及,个人电脑用的CPU有量产优势,让这类CPU成本急速下降,所以同量性能的很多小CPU和大机器的彪悍CPU比起来,成本还是小很多,这就成为分布式系统的直接动力了

要把那么多小机器集合起来当一台“大机器”用,就需要软件让进来的请求分配到这个机器群的各个机器里面,就有了负载均衡的问题,还有容错性,高可靠性等等问题。。


复习知识了,似乎走题越来越远了。。。
头像被屏蔽

禁止发言

发表于 2014-8-8 21:43 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 07:48
你做的应该不是电信对普通用户的实时并发系统,应该也不是有些delay的系统如,(SMS, MMS系统),否则, ...

我做的不是SMS,MMS这样的系统,那样的系统不会用Java去写啦,应用到底层信道垂直开发的,系统结构都不一样

我做的系统业务和SMS这样的类型不太一样吧,一旦用户稳定了,系统的内存需求会比较稳定的,所以设计的时候就计算了设计容量满负荷的时候需要多少内存容量的,然后再乘以一个系数
Advertisement
Advertisement

发表于 2014-8-8 22:00 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我刚到澳洲不久,正在找第一份工作,非常感谢lz提供这样的题目供大家讨论。

发表于 2014-8-8 22:05 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wangbo1118 发表于 2014-8-8 10:10
是的,性能是下降的

他们针对性能的办法很粗暴,就是加硬件。。。据说能用钱解决的问题,都不是问题。。 ...


硬件越来越不值钱了。

本质上,这种对实时性要求比较高的系统,还是尽量避免用Java吧。

发表于 2014-8-8 22:40 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wangbo1118 发表于 2014-8-8 20:43
我做的不是SMS,MMS这样的系统,那样的系统不会用Java去写啦,应用到底层信道垂直开发的,系统结构都不一 ...

对于SMS,MMS这样的系统, 我们建立一个大的内存pool来维护消息。SMS中心是 用 C++实现,因为那时java 还不成熟。到MMS的时候 Java已经比较成熟了。 你上网搜索一下mms library,可能都是java的。 唯一考虑用C++的只有MM1部分。 MM3到MM8 java实现更好些。 呵呵。扯远了,都扯到当年封闭开发的峥嵘岁月了。

回到你的答案吧, 你什么时候调用“get方法”,判断TTL?

wangbo1118 发表: “如果按照这样的理解,那简单一点实现就是ConcurrentHashMap保存<key, value>,value保存的是TTL,然后在get方法里面判断是不是过期了,如果过期了,就返回空,然后清空对应的缓存
这样的简单实现就是不考虑缓存满的情况了,因为题目里面说内存超大的”
头像被屏蔽

禁止发言

发表于 2014-8-8 23:01 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 21:40
对于SMS,MMS这样的系统, 我们建立一个大的内存pool来维护消息。SMS中心是 用 C++实现,因为那时java 还 ...

原来是电信行业的老前辈了,之前的判断也是自己推测的
虽然在电信行业混迹那么久,但是sms mms开发的直接内容真没接触过。而且我想我毕业那会儿,sms的开发应该已经成熟了吧。



那个get方法,我想Cache类有这样的接口:

        public void put(Object key, Object value, int ttl);
        public Object get(Object key);

发表于 2014-8-8 23:15 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wangbo1118 发表于 2014-8-8 22:01
原来是电信行业的老前辈了,之前的判断也是自己推测的
虽然在电信行业混迹那么久,但是sms mms开发的直接 ...

呵呵,不老,当年初中毕业,在一个酒店当服务员,正好有电信公司在酒店封闭开发。一来二去就熟了。 慢慢的他们就把我带成IT蓝领了。

还是回到正题吧。 就如你说的,假设 “不考虑缓存满的情况” ,你是在什么情况下调用get()的?
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2014-8-8 23:27 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 22:15
呵呵,不老,当年初中毕业,在一个酒店当服务员,正好有电信公司在酒店封闭开发。一来二去就熟了。 慢慢 ...

就是用Cache的用户用到才调get


还有我想写一个线程去清理过期的缓存。。

发表于 2014-8-8 23:35 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 22:15
呵呵,不老,当年初中毕业,在一个酒店当服务员,正好有电信公司在酒店封闭开发。一来二去就熟了。 慢慢 ...


“还是回到正题吧。 就如你说的,假设 “不考虑缓存满的情况” ,你是在什么情况下调用get()的?”

用cache的程序会调用get(),这个题目不需要考虑谁来调用get(),有需要就get。

发表于 2014-8-8 23:37 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wangbo1118 发表于 2014-8-8 22:27
就是用Cache的用户用到才调get


"还有我想写一个线程去清理过期的缓存。。"

有必要吗,你能比现有的GC干的活还好?顶多配置一下GC的策略即可。

发表于 2014-8-8 23:37 |显示全部楼层
此文章由 MaxChan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 MaxChan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 11:04
呵呵,这样google 等就不需要花15万找个程序员去优化一台机器了。他们只要花5万找个程序员, 10万买10台 ...

锁跟多线程没有必然关系,锁的产生是因为共享内存,而刚好JAVA的线程通信模型是基于共享内存而已。

发表于 2014-8-8 23:43 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wangbo1118 发表于 2014-8-8 22:27
就是用Cache的用户用到才调get

“Cache的用户用到才调get” 然后 "在get方法里面判断是不是过期了,如果过期了,就返回空,然后清空对应的缓存". 就是这个key被激活了,然后你把它删除了。

就如,银行账户1年过期。1过一年了,用户来存一万元钱。钱进入银行系统了,然后你把他的账户删除了, 因为过期了,是么?

我认为你应该做的是把账户重新激活。
Advertisement
Advertisement

发表于 2014-8-8 23:46 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
MaxChan 发表于 2014-8-8 22:37
锁跟多线程没有必然关系,锁的产生是因为共享内存,而刚好JAVA的线程通信模型是基于共享内存而已。 ...

所以,在这个Java developer的职位上,锁跟多线程就有必然关系了。

发表于 2014-8-8 23:52 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 22:43
“Cache的用户用到才调get” 然后 "在get方法里面判断是不是过期了,如果过期了,就返回空,然后清空对应 ...


“就如,银行账户1年过期。1过一年了,用户来存一万元钱。钱进入银行系统了,然后你把他的账户删除了, 因为过期了,是么? ”

不是把账户删除了,是把cache中的账户信息删除了,你不能指望这个信息一年时间都保存在cache里面,应该放在数据库里面。
头像被屏蔽

禁止发言

发表于 2014-8-8 23:52 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
piddock 发表于 2014-8-8 22:37
"还有我想写一个线程去清理过期的缓存。。"

有必要吗,你能比现有的GC干的活还好?顶多配置一下GC的策 ...

比如ConcurrentHashMap里存了一个key,value,还有ttl,但是过会儿过期了,他们还被ConcurrentHashmap 保存着,怎么能被GC清理出去啊?
头像被屏蔽

禁止发言

发表于 2014-8-8 23:54 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 22:43
“Cache的用户用到才调get” 然后 "在get方法里面判断是不是过期了,如果过期了,就返回空,然后清空对应 ...

是啊,我也同意piddock 的说法,不是账户被删除了,只是cache中找不到了,没法快速办理业务了,他要到后面去翻半天资料才能告诉你账户的情况

发表于 2014-8-9 00:03 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
piddock 发表于 2014-8-8 22:52
“就如,银行账户1年过期。1过一年了,用户来存一万元钱。钱进入银行系统了,然后你把他的账户删除了,  ...

就是Cache定义10s秒过期。 有3个get()线程同时取key(x),A在0秒,B在11秒,C在11.01秒.
A把key(x)存入Cache,因为没有x
B把key(x)删除了,因为过10秒
C再把key(x)存入Cache,为什么?
Advertisement
Advertisement

发表于 2014-8-9 00:04 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 piddock 于 2014-8-8 23:09 编辑
wangbo1118 发表于 2014-8-8 22:52
比如ConcurrentHashMap里存了一个key,value,还有ttl,但是过会儿过期了,他们还被ConcurrentHashmap 保 ...



good point.

看你对系统有怎样的预期了,如果内存足够大的话,就等下次get时再删。如果内存紧张,就遍历hashmap吧(这个代价有点大)。

更新:搞错了,不用遍历hashmap,你用LRU算法时会建立一个双向链表的,从尾巴开始遍历这个链表即可,理论上不难。

发表于 2014-8-9 00:06 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 23:03
就是Cache定义10s秒过期。 有3个get()线程同时取key(x),A在0秒,B在11秒,C在11.01秒.
A把key(x)存入Ca ...


B删了后又放了个新的进去,C就是free rider,享受到了准确的命中。
头像被屏蔽

禁止发言

发表于 2014-8-9 00:13 |显示全部楼层
此文章由 wangbo1118 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wangbo1118 所有!转贴必须注明作者、出处和本声明,并保持内容完整
piddock 发表于 2014-8-8 23:04
good point.

看你对系统有怎样的预期了,如果内存足够大的话,就等下次get时再删。如果内存紧张,就遍 ...

对的,我也是这么想的。。。
内存足够大的话,就等下次get的时候删咯。。

如果内存不足够大 的话,就要清理下

我想的办法是把key和过期时间保存在另外一个TreeMap里面,这样记录就按过期时间顺序排序好了,不用遍历。然后线程相当于Timer,定期去从最先过期的那头读一点记录出来,删,一直读到不过期的记录为止。

当然这样做的基础还是“内存很大”,因为明显是在浪费内存,用空间换效率

发表于 2014-8-9 00:16 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
就是B把key(x)删除,让GC回收。然再申请内存空间, 建立同一个key(x)。 为什么浪费时间去做这个?
在并发系统中,
1.B获得‘写锁’,
2.删除key(x),
3然后释放‘写锁’.
4C来读取key(x)
5.获取写锁建key(x)
如果这个顺序C会准确的命中么?你用什么保证在多线程的情况下,是你的顺序不是我的顺序?

发表于 2014-8-9 00:22 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 23:16
就是B把key(x)删除,让GC回收。然再申请内存空间, 建立同一个key(x)。 为什么浪费时间去做这个?
在并发系 ...


第2步的get操作会load一个新的进入cache,旧的就放在那里,等啥时GC有空了再去回收。
都加锁解锁了,为什么顺序会有问题?你的C的操作虽然在时间上是紧随B的,但是有互斥锁保护,必须等B完全搞定了再去访问,我没看到有什么顺序的问题,会不会是我们讨论的重心有偏差?哈哈,我的工程经验缺乏,有些实际的问题会想不到。
Advertisement
Advertisement

发表于 2014-8-9 00:31 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
piddock 发表于 2014-8-8 23:22
第2步的get操作会load一个新的进入cache,旧的就放在那里,等啥时GC有空了再去回收。
都加锁解锁了,为 ...

1. hashMap, 不可以放入2个相同的key. 改用List结构没法有效查找数据。
2. 在b删除Key(x)对象后, b对key(x)无法锁定,因为key(x)被删除, 和重现新的Key(x)对象之间,。 C获得读锁。cahce 对于C 就miss了。   除非你锁整个cache。那样就不是多线程了。

发表于 2014-8-9 00:43 |显示全部楼层
此文章由 piddock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 piddock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Bessy 发表于 2014-8-8 23:31
1. hashMap, 不可以放入2个相同的key. 改用List结构没法有效查找数据。
2. 在b删除Key(x)对象后, b对key ...


我的理解是x的key还在,x在hashmap中的value被更新了。所以锁定key(x)应该没问题。

发表于 2014-8-9 01:12 |显示全部楼层
此文章由 Bessy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Bessy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wangbo1118 发表于 2014-8-8 22:54
是啊,我也同意piddock 的说法,不是账户被删除了,只是cache中找不到了,没法快速办理业务了,他要到后 ...

噢,是你说“cache中找不到”,能解释一下为什么要把记录Key(x)移除cahce 么?

发表于 2014-8-9 01:13 |显示全部楼层
此文章由 shadowfiend 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 shadowfiend 所有!转贴必须注明作者、出处和本声明,并保持内容完整
which bank?

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部