(在极客时间买了几个专栏,得抓紧读完)/*我是小白,写的一般,大佬就不用看了*/
一、java线程的生命周期
1.线程五态:初始状态,就绪状态,运行状态,休眠状态和终止状态。
在初始状态,创建的线程通常只是在编程语言层面被创建,在os层面还未被创建。
在就绪态,指线程可以分配cpu执行。此时os层面的线程被创建。
当有cpu空闲,分配到cpu的就绪态的线程就转为运行态。
运行态的线程若调用阻塞API或等待某个实践,该线程转为休眠态,同时释放cpu使用权。休眠态的线程无法获得cpu使用去权,只有等待的事件出现,该线程会从休眠态转为可运行态。
线程执行完毕或者出现异常就会进入终止状态,终止状态的线程不会切换到任何状态,意味着线程生命周期结束。
2.Java的线程
new(初始化)
runnable(可运行/运行态)
blocked(阻塞态)
waiting(无时限等待)
timed_waiting(有时限等待)
上面这三个在os层面相当与一个休眠态。只要java线程处于这三种之一,此线程永远没cpu的使用权。
treminated(终止状态)
---------(
————————————————————————————————————————————————————————
下面代码的本意是当前线程被中断之后,退出
while(true),你觉得这段代码是否正确呢?
Thread th = Thread.currentThread();
while(true) {
if(th.isInterrupted()) {
break;
}
// 省略业务代码无数
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}
/* 可能出现无限循环,线程在sleep期间被打断了,抛出一个InterruptedException异常,try catch捕捉此异常,应该重置一下中断标示,因为抛出异常后,中断标示会自动清除掉!
不能中断循环,异常捕获要放在while循环外面 */
为什么当程序运行一段时候后,才抛出InterruptedException?
异常是果不是因,你让它抛它就抛
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
二、如何写出安全的java代码
(安全是个比较大的话题,这里只从程序层面和dos攻击说起。)
先来看个简单的代码
//a,b,c都是int型
if(a+b>c){...}
作为小白来看这只不过是个简单的条件判断语句。但是此处的隐患是数值类型需要注意溢出。看似不起眼,却可能带来逻辑错误,还可能导致严重的安全漏洞。
在java中这个问题处理相对完善。但程序可能调用本地代码,错误的数值可能导致c/c++层的数据越界等问题。
可以改进为: if(a<c-b)
(那个c是负数,b是正数,c-b也可能溢出)
再来看个例子
try {
// 业务代码
} catch (Exception e) {
throw new RuntimeException(hostname + port + “ doesn’t response”);
}
作为渣渣的我,看起来不过是很普通的异常处理操作。
这段代码将敏感信息(hostname)含在异常消息中,试想,如果是一个Web应用,异常也没有良好的包装
很有可能就把内部信息暴露给终端客户。
尽量少暴露信息,也是保证安全的基本原则之一。即使我们并不认为某个信息有安全风险,我的建议也是如果没有必要,不要暴露出来。
攻击和防守是不对称的,只要有一个严重漏洞,对于攻击者就足够了
所以,不能对黑盒形式的部署心存侥幸,这并不能保证系统的安全,攻击者可以利用对软件设计的猜测,结合一系列手段,探测出漏洞。
————————————————————————————————————————————————
以上内容学习自极客时间版权所有: https://time.geekbang.org/column/article/11355