zoukankan      html  css  js  c++  java
  • 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();
                }
            }
        }
    }
    本人经验学识有限,不足之处还希望可以交流交流。
  • 相关阅读:
    linux 命令——48 watch (转)
    linux 命令——47 iostat (转)
    linux 命令——46 vmstat(转)
    linux 命令——45 free(转)
    linux 命令——44 top (转)
    linux 命令——43 killall(转)
    linux 命令——42 kill (转)
    linux 命令——41 ps(转)
    linux 命令——40 wc (转)
    Java for LeetCode 068 Text Justification
  • 原文地址:https://www.cnblogs.com/tdyang/p/14190915.html
Copyright © 2011-2022 走看看