线程的状态6种状态及生命周期
1.new
2.Runnable(Ready和Running)
3.Blocked
4.Waiting
5.Timed_Waiting
6.Terminated
![](https://img-blog.csdnimg.cn/45144a50c1c54f6fa5bee3972132501f.png)
线程同步
同步:一些敏感的数据(比如共享的需要修改的资源)不允许被多个线程同时访问,此时就是用同步访问技术,保证数据在任何同一时刻,最多有一个线程可以访问,以保证数据的完整性。
两种方式:1,同步代码块的方式
注意:使用对象锁的时候一定要保证每个线程竞争的锁锁的是一个对象
class UseSynThread implements Runnable{
private Object object = new Object(); // 对象锁
@Override
public void run() {
synchronized (object){
//同步代码块的方式
System.out.println("同步代码块的方式...");
}
}
}
以下是类锁
public synchronized static void test(){
System.out.println("类锁");
}
//相当于
public static void test01(){
synchronized (UseSynThread.class){
System.out.println("类锁");
}
}
2,同步方法
class UseSynThread implements Runnable{
@Override
public synchronized void run() { //也是对象锁
//同步方法的方式
System.out.println("同步方法的方式...");
}
// 相当于
// @Override
// public void run() {
// synchronized (this){
// //同步方法的方式
// System.out.println("同步代码块的方式...");
// }
// }
}
线程死锁
线程死锁的代码:
package cn.tulingxueyuan.xiaoshanshan.base;
public class DeadLock {
public static void main(String[] args) {
Thread thread1 = new Thread(new DeadLockThread(true));
thread1.setName("线程1");
thread1.start();
Thread thread2 = new Thread(new DeadLockThread(false));
thread2.setName("线程2");
thread2.start();
}
}
class DeadLockThread implements Runnable{
private static Object object1 = new Object();
private static Object object2 = new Object();
private boolean flag ;
public DeadLockThread(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if(flag){
synchronized (object1){
System.out.println(Thread.currentThread().getName() + "线程要获取object1锁资源。");
synchronized(object2){
System.out.println(Thread.currentThread().getName() + "线程要获取object2锁资源。");
}
}
}else{
synchronized (object2){
System.out.println(Thread.currentThread().getName() + "线程要获取object2锁资源。");
synchronized(object1){
System.out.println(Thread.currentThread().getName() + "线程要获取object1锁资源。");
}
}
}
}
}
运行结果如下:
jconsole看一下:
释放锁资源
正常情况下,run方法执行结束了就会释放锁
wait()方法也会释放锁
但是sleep()和yield()方法都不会释放锁资源。