一、基本介绍:
关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程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); }}