Menu
Woocommerce Menu

命令来帮你找到那些需要清理的文件,Java高并发编程

0 Comment

有一个问题几乎困扰着所有的文件系统 — 包括 Unix 和其他的 —
那就是文件的不断积累。几乎没有人愿意花时间清理掉他们不再使用的文件和整理文件系统,结果,文件变得很混乱,很难找到有用的东西,要使它们运行良好、维护备份、易于管理,这将是一种持久的挑战。

Java高并发编程(二),java并发编程

taskset -cp <CPU ID | CPU IDs> <Process ID>

Credit: Sandra H-S

  二、重入锁

  1.reentrantlock关键字(相较于synchronized更加灵活)

  2.reentrantlock用于替代synchronized,在使用此锁时必须要手动释放锁,在使用synchronized锁时遇到异常时,jvm会自动释放锁,但是reentrantlock必须要手动释放锁,因此经常在finally中进行锁的释放

  Lock  lock = new Reentrantlock();//将参数设置为true时此锁为公平锁

  lock.lock();//相当于synchronized(this)

  lock.unlock();//开锁

  3.使用reentrantlock可以进行尝试锁定“tryLock”,这样在指定时间内无法锁定,线程可决定是否继续等待

  Boolean locked =lock.tryLock();

  if(locked)lock.unlock();

  先假定没有得到锁

  Boolean locked = false;

  try{

    locked = lock.tryLock(5,TimeUnit.SECONDS);//先尝试等5秒

    //代码逻辑,根据返回值判断

  }catch{

  }finally{

    if(locked)

      lock.unlock();//根据返回值来判断是否开锁,如果已经得到锁就打开,未得到就不开

  }

  4.使用reentrantlock可以调用lockInterruptibly方法,可以相应interrupt方法作出响应(可被打断方法),使用其他线程打断当前线程等待

  5.reentrantlock还可以被指定为公平锁,而synchronized为非公平锁(非公平锁的效率相对公平锁来说较高)

    公平锁:可以假定谁等待时间长谁获得锁

    非公平锁:不考虑等待时间

可以这样,把指定的CPU核绑定到你的进程。

我见过的一种解决问题的方法是建议使用者将所有的数据碎屑创建一个文件集合的总结报告或”概况”,来报告诸如所有的文件数量;最老的,最新的,最大的文件;并统计谁拥有这些文件等数据。如果有人看到五年前的一个包含五十万个文件的文件夹,他们可能会去删除哪些文件

或者,至少会归档和压缩。主要问题是太大的文件夹会使人担心误删一些重要的东西。如果有一个描述文件夹的方法能帮助显示文件的性质,那么你就可以去清理它了。

当我准备做 Unix 文件系统的总结报告时,几个有用的 Unix
命令能提供一些非常有用的统计信息。要计算目录中的文件数,你可以使用这样一个
find 命令。

  1. $ find .-type f | wc -l
  2. 187534

虽然查找最老的和最新的文件是比较复杂,但还是相当方便的。在下面的命令,我们使用
find
命令再次查找文件,以文件时间排序并按年-月-日的格式显示,在列表顶部的显然是最老的。

在第二个命令,我们做同样的,但打印的是最后一行,这是最新的。

  1. $ find -type f -printf '%T+ %p\n'| sort | head -n 1
  2. 2006-02-03+02:40:33./skel/.xemacs/init.el
  3. $ find -type f -printf '%T+ %p\n'| sort | tail -n 1
  4. 2015-07-19+14:20:16./.bash_history

printf 命令输出 %T(文件日期和时间)和 %P(带路径的文件名)参数。

如果我们在查找家目录时,无疑会发现,history 文件(如
.bash_history)是最新的,这并没有什么用。你可以通过 “un-grepping”
来忽略这些文件,也可以忽略以.开头的文件,如下图所示的。

  1. $ find -type f -printf '%T+ %p\n'| grep -v "\./\."| sort | tail -n 1
  2. 2015-07-19+13:02:12./isPrime

寻找最大的文件使用
%s(大小)参数,包括文件名(%f),因为这就是我们想要在报告中显示的。

  1. $ find -type f -printf '%s %f \n'| sort -n | uniq | tail -1
  2. 20183040 project.org.tar

统计文件的所有者,使用%u(所有者)

  1. $ find -type f -printf '%u \n'| grep -v "\./\."| sort | uniq -c
  2. 180034 shs
  3. 7500 jdoe

如果文件系统能记录上次的访问日期,也将是非常有用的,可以用来看该文件有没有被访问过,比方说,两年之内没访问过。这将使你能明确分辨这些文件的价值。这个最后访问(%a)参数这样使用:

  1. $ find -type f -printf '%a+ %p\n'| sort | head -n 1
  2. FriDec1503:00:302006+./statreport

当然,如果大多数最近​​访问的文件也是在很久之前的,这看起来你需要处理更多文件了。

  1. $ find -type f -printf '%a+ %p\n'| sort | tail -n 1
  2. WedNov2603:00:272007+./my-notes

要想层次分明,可以为一个文件系统或大目录创建一个总结报告,显示这些文件的日期范围、最大的文件、文件所有者们、最老的文件和最新访问时间,可以帮助文件拥有者判断当前有哪些文件夹是重要的哪些该清理了。

Linux find 命令用法总结 
http://www.linuxidc.com/Linux/2015-04/116854.htm

Linux下查找文件find命令 
http://www.linuxidc.com/Linux/2014-10/108575.htm

Linux下find命令详解
http://www.linuxidc.com/Linux/2011-08/40669.htm

文本查找利器find的使用
http://www.linuxidc.com/Linux/2014-03/97559.htm

功能强大的find命令
http://www.linuxidc.com/Linux/2014-01/95236.htm

Linux系统find命令详解
http://www.linuxidc.com/Linux/2014-06/103232.htm


via: Handy commands for profiling your Unix file
systems

作者:Sandra
Henry-Stocker
译者:strugglingyouth
校对:wxy

本文由 LCTT
原创翻译,Linux中国 荣誉推出

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121316.htm

图片 1

  四、线程局部变量

  1.ThreadLocal关键字,线程局部变量

  2.线程局部变量之间互不影响,框架中大量使用,ThreadLocal使用空间换时间,而synchronized是使用时间换空间

public class ThreadLocal1 {
 /*volatile*/ static Person p = new Person();

 public static void main(String[] args) {

  new Thread(()->{
   try {
    TimeUnit.SECONDS.sleep(2);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }

   System.out.println(p.name);
  }).start();

  new Thread(()->{
   try {
    TimeUnit.SECONDS.sleep(1);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   p.name = "lisi";
  }).start();
 }
}

public class ThreadLocal2 {
 //volatile static Person p = new Person();
 static ThreadLocal<Person> tl = new ThreadLocal<>();

 public static void main(String[] args) {

  new Thread(()->{
   try {
    TimeUnit.SECONDS.sleep(2);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }

   System.out.println(tl.get());
  }).start();

  new Thread(()->{
   try {
    TimeUnit.SECONDS.sleep(1);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   tl.set(new Person());
  }).start(); 
 }

 static class Person {
  String name = "zhangsan";
 }
}

下面用一个简单的例子来说明怎样做到。

标签:,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图