一、基本介绍:
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
二、synchronized实现原理
在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景:
还有比较详细的说明,请看文章:https://www.jianshu.com/p/d53bf830fa09
举个简单例子
package com.youyou.ch1.syn;
public class SynClzAndInst {
//使用类锁的线程
private static class SynClass extends Thread{
@Override
public void run() {
System.out.println("TestClass is running...");
synClass();
}
}
//使用对象锁的线程
private static class InstanceSyn implements Runnable{
private SynClzAndInst synClzAndInst;
public InstanceSyn(SynClzAndInst synClzAndInst) {
this.synClzAndInst = synClzAndInst;
}
@Override
public void run() {
System.out.println("TestInstance is running..."+synClzAndInst);
synClzAndInst.instance();
}
}
//使用对象锁的线程
private static class Instance2Syn implements Runnable{
private SynClzAndInst synClzAndInst;
public Instance2Syn(SynClzAndInst synClzAndInst){
this.synClzAndInst = synClzAndInst;
}
@Override
public void run() {
System.out.println("TestInstance2 is running..."+synClzAndInst);
synClzAndInst.instance2();
}
}
//锁对象
private synchronized void instance(){
try {
Thread.sleep(3000);
System.out.println("synInstance is going..."+this.toString());
Thread.sleep(3000);
System.out.println("synInstance ended "+this.toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//锁对象
private synchronized void instance2(){
try {
Thread.sleep(3000);
System.out.println("synInstance1 is going..."+this.toString());
Thread.sleep(3000);
System.out.println("synInstance1 ended "+this.toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//类锁,实际是锁类的class对象
private static synchronized void synClass() {
try {
Thread.sleep(1000);
System.out.println("synClass going...");
Thread.sleep(1000);
System.out.println("synClass end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SynClzAndInst synClzAndInst = new SynClzAndInst();
Thread t1 = new Thread(new InstanceSyn(synClzAndInst));
SynClzAndInst synClzAndInst2 = new SynClzAndInst();
Thread t2 = new Thread(new Instance2Syn(synClzAndInst));
t1.start();
t2.start();
// SynClass synClass = new SynClass();
//synClass.start();
//SleepTools.second(1);
}
}