java线程的几个状态和锁的作用范围

线程的生命周期

 

 线程锁的作用范围:

1、对象实例锁,锁住同一个对象

demo1:

当t1获取线程时,t2会等待t1睡两秒后执行,这也说明了Thread.sleep()不会释放锁资源

/**
 * 锁的作用范围
 */
public class SynchronizedTest {

    public static void main(String[] args) {
        SynchronizedTest synchronizedTest = new SynchronizedTest();
        new Thread(()->{
            synchronizedTest.test1();
        },"t1").start();

        new Thread(()->{
            synchronizedTest.test1();
        },"t2").start();
    }

    synchronized void test1(){
        System.out.println(Thread.currentThread().getName()+"获取锁");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

demo2:当我们再new一个SynchronizedTest 时,synchronizedTest ,synchronizedTest2 是不同的实例,t1,t2线程几乎是同时输出结果,这也说明了

synchronized 修饰实例方法时,锁住得是实例对象,相当于synchronized(this) void test1(){
public class SynchronizedTest {

    public static void main(String[] args) {
        SynchronizedTest synchronizedTest = new SynchronizedTest();
        SynchronizedTest synchronizedTest2 = new SynchronizedTest();
        new Thread(()->{
            synchronizedTest.test1();
        },"t1").start();

        new Thread(()->{
            synchronizedTest2.test1();
        },"t2").start();
    }

    synchronized void test1(){
        System.out.println(Thread.currentThread().getName()+"获取锁");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

demo3:synchronized这次修饰代码块,其执行结果是和demo1是一样的,这三种都是锁住的对象实例

public class SynchronizedTest {

    public static void main(String[] args) {
        SynchronizedTest synchronizedTest = new SynchronizedTest();
        new Thread(()->{
            synchronizedTest.test1();
        },"t1").start();

        new Thread(()->{
            synchronizedTest.test1();
        },"t2").start();
    }

     void test1(){
         synchronized(this){
             System.out.println(Thread.currentThread().getName()+"获取锁");
             try {
                 Thread.sleep(2000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
    }
}

2、静态方法,类对象:锁住的是Class,类锁

demo4:当t1获取线程时,t2会等待t1睡两秒后执行,这里的静态方法锁住的是类对象

public class SynchronizedTest {

    public static void main(String[] args) {
new Thread(()->{
            SynchronizedTest.test1();
        },"t1").start();

        new Thread(()->{
            SynchronizedTest.test1();
        },"t2").start();
    }

    synchronized static void test1(){
             System.out.println(Thread.currentThread().getName()+"获取锁");
             try {
                 Thread.sleep(2000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
    }
}

demo5:当我们new了两个不同的实例,当t1线程获取锁是,t2线程会等待两秒后执行,这说明了锁住了类对象,

synchronizedTest,synchronizedTest2 是两个不同的实例,当是同一个类对象。
public class SynchronizedTest {

    public static void main(String[] args) {
        SynchronizedTest synchronizedTest = new SynchronizedTest();
        SynchronizedTest synchronizedTest2 = new SynchronizedTest();
        new Thread(()->{
            synchronizedTest.test1();
        },"t1").start();

        new Thread(()->{
            synchronizedTest2.test1();
        },"t2").start();
    }

   void test1(){
        synchronized (SynchronizedTest.class) {
            System.out.println(Thread.currentThread().getName() + "获取锁");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

posted @ 2021-08-22 15:12  来一杯可乐  阅读(238)  评论(0编辑  收藏  举报