比如多个线程会写log,但是只有一个log文件,这样文件句柄会被多个线程打开,这个不是我想看到的,现在只有一个方法可以写log文件(比如:void Log(String msg)),如果锁住这个方法每次只有一个线程可以写,其他线程只能等待写完后才能抢到锁?还有一个问题,java里的锁能被自己递归获得么?比如有一个方法递归调用自己,而这个方法是线程安全的进入后会加锁这样会死锁么?

解决方案 »

  1.   

    NIO的文件锁 有写锁和读锁锁是相对线程而言的 递归在一个线程中 没有和自己抢占资源 死锁的概念
      

  2.   

    应该用一个log类将写文件的操作封装,然后用synchronized方法来实现具体的写文件。这样只有一个线程可以真正的写文件。不过这样做效率很低,建议用缓存将要写的内容分批的写入~!
      

  3.   

    (1)
    void Log(String msg){
       synchronized(this.getClass()){
          写文件
       }
    }
    (2)这叫锁的可重入性,同一个线程可以在保持锁不释放的前提下,再次获得此锁。