首页 > 学院 > 开发设计 > 正文

Java Synchronized 关键字

2019-11-14 22:39:52
字体:
来源:转载
供稿:网友
java Synchronized 关键字本文内容
  • Synchronized 关键字
  • 示例
  • Synchronized 方法
  • 内部锁(Intrinsic Locks)和 Synchronization
  • 参考资料
下载 Demo Synchronized 关键字

Java 语言提供两个基本的同步机制:synchronized 方法(synchronized methods )和 synchronized 语句(synchronized statements)。

示例

先大概说一下 Java Synchronized 关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻只有一个线程执行该段代码。

  • 当两个线程访问同一个对象 synchronized(this) 代码块时,只能有一个线程执行,另一个线程必须等待这个线程执行完后才能执行;
  • 但是,当一个线程访问一个对象 synchronized(this) 同步代码块时,另一个线程仍能访问该对象的非 synchronized(this) 代码块;
  • 尤其是,当一个线程访问一个对象的一个 synchronized(this) 代码块时,其他线程对该对象中其他所有 synchronized(this) 代码块的访问也将被阻塞;
  • 以上规则对其它对象锁同样适用。

如下代码所示:

package cn.db.syncdemo;
public class NewClass {
    /**
     * 同步方法
     */
    public void synchronizedMethod() {
        synchronized (this) {
            int i = 5;
            while (i-- > 0) {
                System.out.PRintln(Thread.currentThread().getName() + " : " + i
                        + " synchronized method");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    System.out.println(e.toString());
                }
            }
        }
    }
    /**
     * 同步方法 2
     */
    public void synchronizedMethod2() {
        synchronized (this) {
            int i = 5;
            while (i-- > 0) {
                System.out.println(Thread.currentThread().getName() + " : " + i
                        + " synchronized method 2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println(e.toString());
                }
            }
        }
    }
    /**
     * 非同步方法
     */
    public void nonSynchronizedMethod() {
        int i = 5;
        while (i-- > 0) {
            System.out.println(Thread.currentThread().getName() + " : " + i
                    + " nonSynchronized method");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println(e.toString());
            }
        }
    }
    public static void main(String[] args) {
        final NewClass mClass = new NewClass();
        // t1 和 t2 都要访问同一个同步方法 synchronizedMethod
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                mClass.synchronizedMethod();
            }
        }, "Thread 1");
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                mClass.synchronizedMethod();
            }
        }, "Thread 2");
        // t3 要访问另一个同步方法 synchronizedMethod2
        Thread t3 = new Thread(new Runnable() {
            public void run() {
                mClass.synchronizedMethod2();
            }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表