Java 杂谈java多线程

Java 多线程(三):Synchronized 详解

2018-07-03  本文已影响34人  聪明的奇瑞

案例需要自己运行一遍代码看输出结果才能理解得更深刻

Synchronized 方法锁与代码锁

// (1)修饰普通方法-对象锁
public synchronized void a() {}
// (2)修饰静态方法-类锁
public static synchronized void a() {}
// (1)修饰代码块-对象锁
public void a() {
    synchronized(syncObject){
        
    }
}
// (2)修饰代码块-类锁
public void a() {
    synchronized(XXX.class){
        
    }
}

Synchronized 对象锁与类锁

对象锁

public class Main {
    public static void main(String[] args) {
        SyncTest s1 = new SyncTest();
        new Thread(()->s1.a()).start();
        new Thread(()->s1.b()).start();
    }

    public static class SyncTest {

        public synchronized void a() {
            try {
                System.out.println(Thread.currentThread().getId() + ":--a--start  ,  " + System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getId() + ":--a--end  ,  " + System.currentTimeMillis());
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        public synchronized void b() {
            System.out.println(Thread.currentThread().getId() + ":--b--start  ,  " + System.currentTimeMillis());
        }
        
        public void c() {
            System.out.println(Thread.currentThread().getId() + ":--b--start  ,  " + System.currentTimeMillis());
        }
    }
}
SyncTest s1 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s1.c()).start();
}
SyncTest s1 = new SyncTest();
SyncTest s2 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s2.a()).start();

类锁

public class Main {
    public static void main(String[] args) {
        SyncTest s1 = new SyncTest();
        SyncTest s2 = new SyncTest();
        new Thread(()->s1.a()).start();
        new Thread(()->s2.a()).start();
    }

    public static class SyncTest {

        public static synchronized void a() {
            try {
                System.out.println(Thread.currentThread().getId() + ":--a--start  ,  " + System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getId() + ":--a--end  ,  " + System.currentTimeMillis());
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        public synchronized void b() {
            System.out.println(Thread.currentThread().getId() + ":--b--start  ,  " + System.currentTimeMillis());
        }
    }
}
SyncTest s1 = new SyncTest();
SyncTest s2 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s2.b()).start();
上一篇 下一篇

猜你喜欢

热点阅读