• 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();
                }
            }
        }
    }
    本人经验学识有限,不足之处还希望可以交流交流。
  • 相关阅读:
    test
    结构体内存对齐
    单链表(指针的指针应用)
    C语言实现线程池
    线程私有数据和pthread_once
    fcntl函数
    同构树
    动态规划经典题
    DP--方格取数问题
    动态规划的基本模型
  • 原文地址:https://www.cnblogs.com/tdyang/p/14190915.html
Copyright © 2020-2023  润新知