1 每次查询少查点,用rowid记录标记位,下次查询从标记位开始。就是个变相的分页。2 jdk1.5以后有了java.util.concurrent包。
  wait/notify  是另外一种方式?我第一次听说。

解决方案 »

  1.   

    我也不是很理解 我觉得线程同步除了关键字synchronized以外好像没有其他方式了,可是面试那人让我想想还有冒得其他方式,他说synchronized太慢了。
      

  2.   

    synchronized 同步的代码越多,效率越低,尽量锁更少的代码块。
    至于其他方式,坐等大神回答。
      

  3.   

    关于锁代码块和锁方法,楼主可以参考下单例模式的写法 java单例
      

  4.   

    这个是最简单的实现方式了,定义一个public 的静态变量标记是否允许查询数据库,,true允许,,false不允许,,,并且查询过程中把状态置为false 即可。
      

  5.   

    这个是最简单的实现方式了,定义一个public 的静态变量标记是否允许查询数据库,,true允许,,false不允许,,,并且查询过程中把状态置为false 即可。 高 学习了 
      

  6.   

    1、最优方案:干掉那个数据库管理员,啥理由3秒断一次啊。
       干不掉可以弄个什么存储过程什么什么的,或去本地执行。
       这个也办不到,就只好像分页一样一段一段取,回来拼在一起,3秒能够取回来。或者排序取,到那条断了下次继续从哪里开始。
    2、同步这个,concurrent包里面有lock的方式,不过我看作者并不是特别推荐随意使用那东西。
       这个之外,其实,你还可以借助RandomAccessFile中的文件锁或者数据库中的行锁或表锁实现同步。
      

  7.   

    lock接口可以,不过我从来没有用过
    线程同步和并发是有区别的。我想你还没有搞懂。myblog
      

  8.   

    可以使用lock 来保证多线程同步
    如果只是想让线程顺序执行某个方法,比如
    原方法public synchronized void method1(){
        //do something here
    }使用lockprivate final ReentrantLock lock = new ReentrantLock();
    public void mehtod1(){
        lock.lock();
        try{
            //do something here
        }finally{
            lock.unlock();
        }}
    还有一种可能是为了缓存数据并发性更好,比如某个类中有一个数据集用于做缓存的,为了让读写性能更佳(原方法不举例,因为不试过)
    class RWDictionary {
        //缓存集合 m
        private final Map<String, Data> m = new TreeMap<String, Data>(); 
        private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
        //读取锁,多个线程可以同时获取该锁
        private final Lock r = rwl.readLock();
        //写入锁,当写入锁被获取后,之后的读取乐和写入锁都得等待当前写入锁释放
        private final Lock w = rwl.writeLock();    public Data get(String key) {
            r.lock();
            try { return m.get(key); }
            finally { r.unlock(); }
        }
        public String[] allKeys() {
            r.lock();
            try { return m.keySet().toArray(); }
            finally { r.unlock(); }
        }
        public Data put(String key, Data value) {
            w.lock();
            try { return m.put(key, value); }
            finally { w.unlock(); }
        }
        public void clear() {
            w.lock();
            try { m.clear(); }
            finally { w.unlock(); }
        }
     }另外想跟楼主讨论讨论线程同步的做用。
    线程同步极大的可能是为了数据的一至性,而一至性就很有可能会涉及系统的并发性能。
    所以了解线程同步再试着了解一下并发方面的知识会有相互了解的做用。
      

  9.   

    同步在java有三种方法,除了工具外:
    1 synchronized 初学最方便
    2 lock 要点经验
    3 volatile 变量关键字
      

  10.   

    关于第二个问题,我想面试官是想让你用忙等的方式同步线程。比如:    while (!flag);
        access shared resource
        flag = true;详见经典的Peterson算法。
      

  11.   

    java5.0以后推出了比sychornized更好的lock
      

  12.   

    没看明白,多线程去取数据么,2000w条数据count(×)都要几秒钟,一般大数据是设置缓存加载的,先取第一页,然后采用虚模式加载进来,多线程并发取数,那连接池的开销不大么。
      

  13.   

    三秒一断真是闲的,直接问DBA要dump,不行拿他老大给他施压
      

  14.   

    关于锁代码块和锁方法,楼主可以参考下单例模式的写法 java单例
      

  15.   

    Wait/notify/notifyAll and Condition.await/signal/signalAll are the communicating way between threads while Synchronized/Lock(ReentrantLock/ReentrantReadWriteLock) is synchronization mechanism.
    For JDK1.5, Lock mechanism can provide better performance than traditional synchronized mechanism.
    For JDK1.6 or above,there is tiny difference between both in performance. You're supposed to have a thorough grasp of these basic concept of muti-thread before you start to design the multi-thread programming. 
      

  16.   


    Would you please help me answer this question mentioned in this post?
    http://bbs.csdn.net/topics/390682414 
      

  17.   

    说synchronized慢的都是水货,jdk1.6之后synchronized和lock的实现是一样的。(偏向,自旋,监视)
    synchronized耗时在10ns级别,不是synchronized慢,而是synchronized块里做了什么,一般内存运算没问题,要是涉及IO就可能不对了。
    concurrent包里有很多高级的东西,不推荐用,一般业务开发也用不到,除非写框架。我的soa框架倒是把concurrent里的东西用了个遍。
      

  18.   

    对于第二个问题,面试官可能是想问你synchronized实现同步的原理是什么
      

  19.   

    楼主可以考虑用ThreadLocal,它并不是一个Thread,而是Thread的局部变量,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。具体使用以及例子,可以在我的博客http://www.nyister.net/archives/175看到。希望对楼主有所帮助……
    PS:博客内容是由原来的csdn导入进去的,代码格式有些许处理不当,不过应该不影响阅读……
      

  20.   

    lock啊,synchronized已经淘汰了。
      

  21.   

    JAVA的功能的功能真是少得可怜...
    所谓的标志同步, 简单采用 CAS 进行与或非置换就行了..Win平台就是InterlockCompareExchange.
    JAVA不知道有没有保留这些基础函数, 有的话用这种最节省时间, 时间是CPU级别的, 不是系统级别的.
    数据库的问题上, 先执行一条存储过程把数据库的2000万查出来写入N个临时表, 然后每3秒断线一次的情况下, 每3秒拿一个表回来, 然后组合起来不就2000万的数据了么...断线多少遍都行, 只是速度问题.