Linux速查
巨人的肩膀:cnblogs.com/chenliangchaoshuai/p/11827383.html
linux 命令linux 命令是对 Linux 系统进行管理的命令。对于 Linux 系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux 系统管理的命令是它正常运行的核心。
线上查询及帮助命令 (2 个)man:查看命令帮助,命令的词典,更复杂的还有 info,但不常用。
help:查看 Linux 内置命令的帮助,比如 cd 命令。
文件和目录操作命令 (18 个)ls:全拼 list,功能是列出目录的内容及其内容属性信息。
cd:全拼 change directory,功能是从当前工作目录切换到指定的工作目录。
cp:全拼 copy,其功能为复制文件或目录。
find:查找的意思,用于查找目录及目录下的文件。
mkdir:全拼 make directories,其功能是创建目录。
mv:全拼 move,其功能是移动或重命名文件。
pwd:全拼 print working directory,其功能是显示当前工作目录的绝对路径。
renam ...
“楚门世界”无处不在,我们可能被异化的 23 个证据 | 100 个生活大问题
转自:http://www.qdaily.com/articles/64605.html王朝靖2019 年 10 月 1 日
世界总会在某个瞬间露出马脚。
人对「不能做自己」有着漫长的恐惧史。
270 多年前,卢梭在《论人类不平等的起源》里指出人的异化处境:人类脱离自己原有的天性,在社会的形成过程中逐渐扭曲变形,原本平等的人类动物界,因为私有制的产生而逐渐充斥着不平等和压迫。因为技术的发展,人得以过上舒适的生活,而人一旦习惯了一种舒适,就再也不觉得它有多舒适了,相反没有它就会觉得难受。于是,人类无止境地追求更好的享受开始了,人也在这种追求中,从自然动物被「异化」成「啥都要拿来比较」的文明人。
后来黑格尔和马克思把「异化」的概念发扬光大,人的异化逐渐变成这样一种状态:原本人类发明了各种制度、工具、准则,但在使用的过程中,人逐渐背离了自身的目的,开始改变自己去服务那些制度和工具。而那些工具,则反客为主开始控制人类:
原本「考试」(客体)是为了检测「知识」(主体)掌握情况,后来人为了考试而去钻研如何考试。
原本「钱」是为了「物品」的流通和交换,后来人不惜消耗自己的健康和生命去赚取更多的钱,再 ...
equals()
equals()以前对它的认知只是知道在比较引用类型的时候用equals(),比较基本类型的时候用==。但是对它的判断原理没做过研究,这篇文章用来探究equals()的作用机制,以及如何去实现一个规范的equals()方法。
Java语言规范要求equals()方法具有下面的特性
自反性:对于任何非空引用x,x.equals(x)应该返回true
对称性:对于任何引用x和y,当且仅当y.equals(x)返回true时,x.equals(y)返回true
传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true
一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果
对于任意非空引用x,x.equals(null)应该返回false
就equals()而言最直接的实现方法就是利用instanceof来判断两个对象引用指向的对象是否来自同一个类,如果指向相同,那equals()自然应该返回true,比如java.util.Date下的equals()就是这样 ...
线程池
为什么要使用线程池线程池的优势:线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。
它的主要特点为:线程复用;控制最大并发数;管理线程。
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会销耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
线程池的架构
Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类。
线程池的实现Executors.newFixedThreadPool(int)
1234567 public static ExecutorService newFixedThreadPool(int nThreads ...
fork-join与异步计算
fork-join框架fork-join提供了一种方法来将大任务拆分成小任务(fork),再将小任务合并(join)来完成计算。如果想完成这种递归计算需要扩展RecursiveTask<T>类或者RecursiveAction类(如果不需要返回值的话)。再覆盖compute()方法,在compute()方法中实现子任务。
1234567891011121314151617181920212223242526272829303132333435363738class MyTask extends RecursiveTask<Integer>{ private static final Integer ADJUST_VALUE = 10; private int begin; private int end; private int result; MyTask(int begin,int end){ this.begin = begin; this.end = end; } ...
《Java核心技术 卷II》 Stream库
为什么需要Stream在很多时候我们需要遍历一个集合,根据一些条件从中筛选出我们需要的元素,常规的做法就是用foreach遍历,在foreach块里做判断来筛选。而Stream提供了一种抽象程度更高的选择,使我们在完成计算任务的时候只需要说明需要完成什么任务,而不是说明如何去实现它。
Stream的特点1、流不存储元素。这些元素可能存储在底层的集合中,或者是按需生成的。
2、流的操作不会修改其数据源。
3、流的操作时尽可能惰性执行的。这意味着知道需要其结果的时候,操作才会执行。
四大函数式接口
12345678910111213141516171819//R apply(T t)函数式接口,一个参数,一个返回值Function<String, Integer> function = String::length;System.out.println(function.apply("function"));//boolean test(T t)断定型接口,一个参数,返回booleanPredicate<String> predicate = t -> ...
在多线程下要注意的一些问题
虚假唤醒Resource有两个方法一个给number自增另一个自减,四个线程,分别扮演生产者和消费者的角色。当生产者将number加一后便进入等待状态并唤醒消费者,消费者消费完后进入等待状态并唤醒生产者。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071class Resource { private int number = 0; public synchronized void increment() throws InterruptedException{ if (number != 0){ this.wait(); } number++; System.out.println(Thread.currentThread().getName ...
在配置完JWT验证后,前端不能访问的问题
JWT验证:
123456789101112131415161718192021222324@Componentpublic class Authorization implements HandlerInterceptor { @Autowired private JwtUtil jwtUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { final String authHeader = request.getHeader("Admin-Token"); try { if (!StringUtils.isEmpty(authHeader)) {// System.out.println(authHeader); Claims clai ...
《Java核心技术 卷I》第12章 并发 Ⅱ
synchronized关键字 在Java中每个对象都有一个内部锁,如果一个方法声明时有synchronized关键字,那么这个对象的锁将保护整个方法。也就是说,要调用这个方法,线程必须获得对象内部锁。不单单是对象,也可以对静态方法加synchronized关键字,此时调用这样的静态同步方法的时候,它会获得相关类对象的内部锁。因此没有其他线程可以调用这个类的该方法或任何其他任何同步静态方法。
内部锁和条件存在一些限制。包括:
不能中断一个正在尝试获得锁的线程。
不能指定尝试获得锁时的超时时间。
每个锁仅有一个条件可能是不够的。
在加锁的过程中到底是使用synchronized还是JUC取决于这个锁的条件是否复杂,如果复杂则使用JUC。当然还可以使用阻塞队列来完成同步。
同步块 除了synchronized还有另一种机制可以获得锁:即进入一个同步块,当线程进入如下形式的块时
123synchronized(obj){ critical section}
它会获得obj的锁。这里需要注意一点,即使是使用Vec ...
《Java核心技术 卷I》第12章 并发
多进程与多线程的区别? 本质的区别在于每个进程拥有自己的一整套变量,而线程则是共享数据。
线程的状态
New(新建)
Runnable(可运行)
Blocked(阻塞)
Waiting(等待)
Timed waiting(计时等待)
Terminated(终止)
确定一个线程的当前状态,只需要调用getState方法。当用new关键字创建一个新线程时,如new Thread(r),这个线程还没有开始运行。那意味着它的状态是新建(new)。当一个线程处于新建状态的时候,程序还没有开始运行线程中的代码。一旦调用start方法,线程就处于可运行(runnable)状态。这个线程具体什么时间开始运行,这取决于操作系统的的调用而不是代码的顺序。抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完时操作系统剥夺该线程的运行权,并给另一个线程一个机会来运行。当选择下一个线程时,操作系统会考虑线程的优先级。
竞态条件 如上所述,线程间的数据是共享的,这也就引发了线程不安全的问题。有两个线程同时执行指令
1account[to] += ...