如何从线程锁定函数访问

时间:2014-03-09 23:32:18

标签: java multithreading

您好我的代码如下。

class main{
    main()
    {
        myThread1 mt1 = new myThread1();
        myThread2 mt2 = new myThread2();

        mt1.start();
        mt2.start();

        mt1.join();
        mt2.join()

        System.out.println(access.sb.toString());
    }
}

class myThread1{
    run(){
        access.grow(" IJKLMNOP ");
    }
}

class myThread2{
    run(){
        access.grow(" ABCDEFGH ");
    }
}

class access{
StringBuilder sb = new StringBuilder();
    void grow(str)
    {
        sb.append(str);
    }

}

**忽略错误

输出:

 ABCDE IJKLMFGHFGH

预期输出应该是一个接一个,或副。我想通了,这是因为两个线程都随机访问了函数grow。是否有任何进程,以便我只允许在一个实例上访问函数grow

2 个答案:

答案 0 :(得分:4)

grow标记为synchronized会导致access的特定实例在线程中序列化对grow的调用:

synchronized void grow() {
    ...
}

另一种方法是将工作排入某种线程安全的Queue(通常是某种BlockingQueue),然后在另一个线程上从队列中读取工作,但这可能是根据你提供的背景,没有必要。

答案 1 :(得分:0)

为了获得更好的性能,请使用同步块

       void grow(str)

      {
          synchronize(sb){
            sb.append(str);
       }
       }

你也可以使用并发pkg锁类

      Lock lock = new ReentrantLock();
        void grow(str)

      {
          try{ lock.lock();
            sb.append(str);
        finally(){
           lock.unlock();
        }

       }