线程几种状态:
状态.png
新建 -> 就绪 -> 运行 -> 阻塞 -> 死亡
-
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问数据时进行保护,其他线程不能进行访问直到该线程读取完成其他线程才可使用。不会出现脏数。
-
如何进行保护?
1.加锁 ReetrankLock
2.使用sychronized关键字(使用synchronized修饰的方法或者代码块可以看成是一个 原子操作。)
方法一:
{
synchronized (this) {
for(int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
}
}
方法二:
public synchronized void output(String name) {
// TODO 线程输出方法
for(int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
}
synchronized
1、synchronized加在非静态方法前和synchronized(this)都是锁住了这个类的对象,如果多线程访问,对象不同,就锁不住,对象固定是一个,就可锁住。
2、synchronized(类名.class)和加在静态方法前,是锁住了代码块,不管多线程访问的时候对象是不是同一个,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步,缩小锁的粒度。
reetrankLock和synchronize比较
-
等待可中断:当持有锁的线程长期不释放锁时,正在等待的线程可以选择放弃等待,改为处理其他事情,它对处理执行时间非常上的同步块很有帮助。而在等待由 synchronized 产生的互斥锁时,会一直阻塞,是不能被中断的。
-
可实现公平锁:多个线程在等待同一个锁时,必须按照申请锁的时间顺序排队等待,而非公平锁则不- - 保证这点,在锁释放时,任何一个等待锁的线程都有机会获得锁。synchronized 中的锁时非公平锁,ReentrantLock 默认情况下也是非公平锁,但可以通过构造方法 ReentrantLock(ture)来要求使用公平锁。
-
锁可以绑定多个条件:ReentrantLock 对象可以同时绑定多个 Condition 对象(名曰:条件变量或条件队列),而在 synchronized 中,锁对象的 wait()和 notify()或 notifyAll()方法可以实现一个隐含条件,但如果要和多于一个的条件关联的时候,就不得不额外地添加一个锁,而 ReentrantLock 则无需这么做,只需要多次调用 newCondition()方法即可。而且我们还可以通过绑定 Condition 对象来判断当前线程通知的是哪些线程(即与 Condition 对象绑定在一起的其他线程)。












网友评论