Synchronized的用法

来源:互联网 发布:荷兰语翻译软件 编辑:程序博客网 时间:2024/05/16 19:46


Synchronized java的关键字,目的就是用来修饰某个代码块或是某个方法的时候能保证在同一时间只有一个线程执行该代码。


有以下几种使用场景:

① 当两个并发线程访问同一个对象的synchronized同步代码块时,同一个时间内只能有一个线程执行,另一个线程须等待正在执行的线程执行完该代码块后才能执行;

贴代码

package com.hi.util;public class ThreadTestSynchronized implements Runnable {        @Override    public void run() {        synchronized(this){                        for (int i = 1; i <= 5; i++) {                System.out.println(Thread.currentThread().getName() +" loop -- "+ i);            }            System.out.println(" --- ---");        }    }        public static void main(String[] args) {        ThreadTestSynchronized synchronized_ = new ThreadTestSynchronized();        Thread ta = new Thread(synchronized_, "Thread A");        Thread tb = new Thread(synchronized_, "Thread B");        ta.start();        tb.start();    }}

② 当一个线程访问对象的synchronized同步代码块时,另一个线程仍然可以访问该对象的非synchronized同步代码块。

贴代码

package com.hi.util;public class ThreadTestSynchronized2 {    public void method_a() {        synchronized (this) {            int i = 10;            while (i-- > 0) {                System.out.println(Thread.currentThread().getName() + " -- "                        + i);            }            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    public void method_b() {        int i = 10;        while (i-- > 0) {            System.out.println(Thread.currentThread().getName() + " -- " + i);        }        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        final ThreadTestSynchronized2 synchronized2 = new ThreadTestSynchronized2();        Thread ta = new Thread(new Runnable() {            public void run() {                synchronized2.method_a();            }        }, "ta");        Thread tb = new Thread(new Runnable() {            public void run() {                synchronized2.method_b();            }        }, "tb");        ta.start();        tb.start();    }}

③ 当一个线程访问对象的synchronized同步代码块时,该线程就获得了对象锁,其他线程对该对象的所有的synchronized同步代码块将处于阻塞状态,synchronized修饰的方法也同样处于阻塞状态。

贴代码

package com.hi.util;public class ThreadTestSynchronized2 {    public void method_a() {        synchronized (this) {            int i = 5;            while (i-- > 0) {                System.out.println(Thread.currentThread().getName() + " -- "                        + i);                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }    public void method_b() {        synchronized (this) {            int i = 5;            while (i-- > 0) {                System.out.println(Thread.currentThread().getName() + " -- "                        + i);                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }    public synchronized void method_c() {        int i = 5;        while (i-- > 0) {            System.out.println(Thread.currentThread().getName() + " -- " + i);            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    public static void main(String[] args) {        final ThreadTestSynchronized2 synchronized2 = new ThreadTestSynchronized2();        Thread ta = new Thread(new Runnable() {            public void run() {                synchronized2.method_a();            }        }, "ta");        Thread tb = new Thread(new Runnable() {            public void run() {                synchronized2.method_b();            }        }, "tb");        Thread tc = new Thread(new Runnable() {            public void run() {                synchronized2.method_b();            }        }, "tc");        ta.start();        tb.start();        tc.start();    }}




0 0