学习笔记Java中同步Sychronized关键字

Posted 棉花糖灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记Java中同步Sychronized关键字相关的知识,希望对你有一定的参考价值。

参考自文章Java中Synchronized的用法

synchronized是Java中的关键字,是一种同步锁,可以保证其修饰的代码在同一时间只有一个线程能够访问。

0. 快速入门案例

实现了Runnable接口的SyncThread类:

class SyncThread implements Runnable {
   private static int count;

   public SyncThread() {
      count = 0;
   }

   public  void run() {
      synchronized(this) {
         for (int i = 0; i < 5; i++) {
            try {
               System.out.println(Thread.currentThread().getName() + ": " + (count++));
               Thread.sleep(100);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
      }
   }
}

调用SyncThread类:

SyncThread syncThread = new SyncThread();
Thread thread1 = new Thread(syncThread, "SyncThread1");
Thread thread2 = new Thread(syncThread, "SyncThread2");
thread1.start();
thread2.start();

其输出结果如下:

SyncThread1: 0
SyncThread1: 1
SyncThread1: 2
SyncThread1: 3
SyncThread1: 4
SyncThread2: 5
SyncThread2: 6
SyncThread2: 7
SyncThread2: 8
SyncThread2: 9

可用发现当线程1访问同步代码块时,线程2被阻塞了,只有等到线程1运行完之后线程2才得以执行。

1. 修饰一个代码块

语法:

class ClassName {
    public void method() {
     synchronized(this) {
            // 代码
        }    
    }
}

当一个线程访问对象中的synchronized(this)修饰的代码块时,其他线程对这块代码块的访问将会被阻塞。其中的this表示作用的范围是当前对象。所以如果有多个线程使用了不同的对象来对代码块进行访问时不会有阻塞的情况,只有为同一个对象时才会产生阻塞。

2. 修饰一个方法

语法:

public synchronized void methd() {
    // 方法体
}

以上写法与以下修饰代码块的写法是一样的:

public void method() {
    synchronized(this) {
        // 方法体
    }
}

需要注意的是synchronized关键字在修饰方法时并不能被继承,当子类重写了父类的方法时,同步不在生效。此外,synchronized关键字不能用来修饰接口类的方法和构造方法。

3. 修饰一个静态方法

语法:

public synchronized static void method() {
    // 方法体
}

静态方法又称类方法,它是属于类而非对象的,所以当synchronized修饰静态方法时对类的所有对象都会有效。

4. 修饰一个类

语法:

class ClassName {
    public void method() {
        synchronized(ClassName.class) {
            // 方法体   
        }
    }
}

注意当synchronized关键字修饰一个类时并非是class synchronized CllassName这样的用法,而是类似于修饰代码块时的用法,只不过把synchronized(this)改成了synchronized(ClassName.class),所以作用范围从一个对象实例变为了类的所有对象。也与修饰代码块时类似,对于不用synchronized修饰的部分不会被锁定。

以上是关于学习笔记Java中同步Sychronized关键字的主要内容,如果未能解决你的问题,请参考以下文章

Java连载109-sychronized关键的用途及其注意点自定义注解

Java面试常见问题--Sychronized 和 lock的区别

java并发编程实战读书笔记2

java并发编程实战读书笔记2

juc学习一(volatile关键字及原子变量)

java学习笔记 线程同步