第一题:两个数集,都有20亿个数,4G内存,可以使用外存,求两个数集的交集
第二题:原题就是这样的代码,问高并发环境存在的问题,如何改进
- Java code
public class CountServlet extends HttpServlet{ private volatile static int count; public void processRequest(HttpServletRequest req) { //processRequest } public int getCount() { return count; } public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { count++; processRequest(req); PrintWriter out = resp.getWriter(); out.write("hello"); }}
------解决方案--------------------
AtomicInteger
------解决方案--------------------
第一题不知道 单说第二题
虽然他用了volatile 修饰符 但是这个修饰符仅提供内存可见性保证,不提供原子性。所以在更新属性count的时候 还是要用synchronized代码块的
另外 这个属性是不是静态在并发这里并不重要
------解决方案--------------------
关于第一题:
既然提到4G内存了,两个20亿的数据集。
那就将这两个数据集进行拆分,分为较小的数据集。
然后再利用HashSet之类的东西存储遍历的其中一个数据集,然后再遍历第二个,进行判断~ ······
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
我说一下第一种吧,假设都是int
内存中开一个byte[256][256][256][32],内存消耗250M(按照1000算,按1024算更小)
每个整数占一个字(bit),
比如:1,000,000,000,十六进制表示为3B9ACA00,
那么在这个byte数组中的位置就是bytes[0x3B]b[0x9A][0xCA][0x00]的第1位(右面第一个bit)
如果此bit为0,则表示之前没有1,000,000,000,如果此bit为1,则说明出现过
比如:1,000,000,十六进制表示为000F4240,
那么在这个byte数组中的位置就是bytes[0x00]b[0x0F][0x42][0x08]的第1位
如果此bit为0,则表示之前没有1,000,000,如果此bit为1,则说明出现过
相关公式(不考虑负数,如有负数,考虑使用>>>
bytes[x >> 24][(x >> 16) & 0xFF][(x >> 8) & 0xFF][(x >> 3) % 32],每一个byte的计算:
bytes[x >> 24][(x >> 16) & 0xFF][(x >> 8) & 0xFF][(x >> 3) % 32] |= 1 << (x % 8);