说起java中的synchronized,相信大多数学习java的人都不陌生,这里是谈synchronized的使用,原理不在这里阐述,synchronized一共有5种使用方式,但归根结底,其实synchronized就一种使用方式,synchronized就是对对象进行加锁。
1 | synchronized(object) | 锁object对象 |
2 | synchronized(this) | 锁对象本身 |
3 | synchronized修饰非静态方法 | 锁对象本身 |
4 | synchronized(XXXX.class) | 锁类的Class对象 |
5 | synchronized修饰静态方法 | 锁类的Class对象 |
代码如下:
package com.newbie.syn;
/**
* synchronized不管放在方法的前面,还是对象的前面,还是放在.class的前面,最终synchronized都是对对象进行加锁
* synchronized的5种用法
* 1.synchronized(object) 锁object对象
* 2.synchronized(this) 锁对象本身
* 3.synchronized修饰非静态方法 锁对象本身
* 4.synchronized(XXXX.class) 锁类的Class对象
* 5.synchronized修饰静态方法 锁类的Class对象
*/
public class SynchronizedCase {
//需要加锁的对象
private static final Object object = new Object();
//需要操作的数值
private static int num;
/**
* synchronized对Object对象加锁 实现对代码块的同步
*/
public void addNum1(){
synchronized(object) {
num++;
}
}
/**
* synchronized对this加锁 也就是对象本身加锁 实现对代码块的同步
*/
public void addNum2(){
synchronized(this) {
System.out.println("addNum2 ----------start----------");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
num++;
System.out.println("addNum2 ----------end----------num:" + num);
}
}
/**
* 锁住非静态方法 这里和addNum2一样,其实是对对象本身加锁 实现方法中的代码同步
*/
public synchronized void addNum3(){
System.out.println("addNum3 ----------start----------");
num++;
System.out.println("addNum3 ----------end----------num:" + num);
}
/**
* 在Java中,每一个类都对应着一个Class对象
* synchronized对SynchronizedCase.class加锁 也就是Class对象加锁 实现对代码块的同步
*
*/
public void addNum4(){
synchronized(SynchronizedCase.class) {
System.out.println("addNum4 ----------start----------");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
num++;
System.out.println("addNum4 ----------end----------num:" + num);
}
}
/**
* 在Java中,每一个类都对应着一个Class对象
* 锁住静态方法 这里和addNum4一样,其实是对Class对象加锁 实现方法中的代码同步
*/
public synchronized static void addNum5() {
System.out.println("addNum5 ----------start----------");
num++;
System.out.println("addNum5 ----------end----------num:" + num);
}
}
第一组测试:测试对象锁,addNum2和addNum3同时执行,测试代码如下:
/**
* 测试代码
*/
public static void main(String[] args) {
SynchronizedCase synCase = new SynchronizedCase();
//addNum2和addNum3都是锁对象
new Thread(() -> synCase.addNum2()).start();
new Thread(() -> synCase.addNum3()).start();
}
测试结果:
addNum2、addNum3按顺序执行
第二组测试:测试类Class对象锁,addNum4和addNum5同时执行,测试代码如下:
/**
* 测试代码
*/
public static void main(String[] args) {
SynchronizedCase synCase = new SynchronizedCase();
//addNum4和addNum5都是锁类,其实是锁的Class对象
new Thread(() -> synCase.addNum4()).start();
new Thread(() -> SynchronizedCase.addNum5()).start();
}
测试结果:
addNum4、addNum5按顺序执行