日期:2014-05-20  浏览次数:20765 次

两道笔试题奉上
第一题:两个数集,都有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之类的东西存储遍历的其中一个数据集,然后再遍历第二个,进行判断~ ······

------解决方案--------------------
探讨

第一题不知道 单说第二题

虽然他用了volatile 修饰符 但是这个修饰符仅提供内存可见性保证,不提供原子性。所以在更新属性count的时候 还是要用synchronized代码块的
另外 这个属性是不是静态在并发这里并不重要

------解决方案--------------------
探讨
引用:

第一题不知道 单说第二题

虽然他用了volatile 修饰符 但是这个修饰符仅提供内存可见性保证,不提供原子性。所以在更新属性count的时候 还是要用synchronized代码块的
另外 这个属性是不是静态在并发这里并不重要


volatile是原子性的吧,请指教,

Volatile修饰的成员变量在每次被线程访问时,都强迫从……

------解决方案--------------------
探讨

第一题不知道 单说第二题

虽然他用了volatile 修饰符 但是这个修饰符仅提供内存可见性保证,不提供原子性。所以在更新属性count的时候 还是要用synchronized代码块的
另外 这个属性是不是静态在并发这里并不重要

------解决方案--------------------
探讨
引用:

第一题不知道 单说第二题

虽然他用了volatile 修饰符 但是这个修饰符仅提供内存可见性保证,不提供原子性。所以在更新属性count的时候 还是要用synchronized代码块的
另外 这个属性是不是静态在并发这里并不重要


volatile是原子性的吧,请指教,

Volatile修饰的成员变量在每次被线程访问时,都强迫从……

------解决方案--------------------
我说一下第一种吧,假设都是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);