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();
                }
            }
        }
    }
    本人经验学识有限,不足之处还希望可以交流交流。
  • 相关阅读:
    Beginning ARC in iOS 5 Tutorial Part 1【转】
    移除所有子 View 时不使用循环代码的一种方式
    FrankCucumber Core Frank Steps
    iPhone开发重构:从硬编码到模型到规律【转】
    iPhone开发重构:提取类以构成模板模式 【转】
    FrankCucumber Instance Method Summary
    iOS自动化测试(原创)
    FrankCucumber Step Definition compendium (转载)
    iPhone开发重构:提供辅助创建方法以简化实例创建【转】
    App Store 审核指南[转]
  • 原文地址:https://www.cnblogs.com/tdyang/p/14190915.html
Copyright © 2011-2022 走看看