使用this作为线程对象锁
 在不同线程中,相同对象中的 synchronized 会互斥。 
语法结构: 
synchronized(this){ 
//同步代码 
}  
或
 public synchronized void accessVal(int newVal){
 //同步代码
 }  
/*** 定义程序员类*/class Programer{private String name;public Programer(String name){this.name=name;}//打开电脑public void openConputer(){synchronized (this) {try {System.out.println(this.name + "接通电源");Thread.sleep(500);System.out.println(this.name + "按电脑开机键");Thread.sleep(500);System.out.println(this.name + "系统启动中");Thread.sleep(500);System.out.println(this.name + "系统启动成功");} catch (Exception e) {e.printStackTrace();}}}//编码synchronized public void coding(){try{System.out.println(this.name+"双击启动idea");Thread.sleep(500);System.out.println(this.name+"idea启动成功");Thread.sleep(500);System.out.println(this.name+"写代码");}catch (Exception e){e.printStackTrace();}}//上厕所public void wc(){synchronized("suibian") {try {System.out.println(this.name + "打开厕所门");Thread.sleep(500);System.out.println(this.name + "开始排泄");Thread.sleep(500);System.out.println(this.name + "冲水");Thread.sleep(500);System.out.println(this.name + "离开厕所");} catch (Exception e) {e.printStackTrace();}}}//程序员领取奖金public void programermoney(){synchronized (Programer.class) {try {System.out.println(this.name + "程序员被领导表扬");Thread.sleep(500);System.out.println(this.name + "拿钱");Thread.sleep(500);System.out.println(this.name + "感谢公司");Thread.sleep(500);System.out.println(this.name + "拿钱走人");} catch (Exception e) {e.printStackTrace();}}}}/*** 打开电脑线程*/class Working1 extends Thread{private Programer p;public Working1(Programer p){this.p=p;}@Overridepublic void run() {this.p.openConputer();}}/*** 代码线程*/class Working2 extends Thread{private Programer p;public Working2(Programer p){this.p=p;}@Overridepublic void run() {this.p.coding();}}/***去厕所县城他*/class Working3 extends Thread{private Programer p;public Working3(Programer p){this.p=p;}@Overridepublic void run() {this.p.wc();}}/*** 程序员领取奖金*/class ProgrammerMoney extends Thread{private Programer p;public ProgrammerMoney(Programer p){this.p = p;}@Overridepublic void run() {this.p.programermoney();}}/*** 定义销售员类*/class Saler{private String name;//构造方法public Saler(String name){this.name=name;}//销售员领取奖金public void salermoney(){synchronized (Saler.class) {try {System.out.println(this.name + "被领导表扬");Thread.sleep(500);System.out.println(this.name + "拿钱");Thread.sleep(500);System.out.println(this.name + "感谢公司");Thread.sleep(500);System.out.println(this.name + "拿钱走人");} catch (Exception e) {e.printStackTrace();}}}}/*** 销售员领取奖金线程*/class SalerMoney extends Thread{private Saler s;public SalerMoney(Saler s){this.s=s;}@Overridepublic void run() {this.s.salermoney();}}public class SynchroizedTest {public static void main(String[] args) {// Programer programer=new Programer("老耿");// new ProgrammerMoney(programer).start();// Programer programer1=new Programer("老李");// Programer programer2=new Programer("老王");// new Working3(programer1).start();// new Working3(programer2).start();// new Working1(programer).start();// new Working2(programer).start();Saler s1=new Saler("丽丽");Saler s2=new Saler("美美");new SalerMoney(s1).start();new SalerMoney(s2).start();}}

使用字符串作为线程对象锁
 所有线程在执行 synchronized 时都会同步。 
语法结构:  
 synchronized(“字符串”){  
同步代码
}
代码见上“上厕所”
使用Class作为线程对象锁
 在不同线程中,拥有相同 Class 对象中的 synchronized 会互斥。 
语法结构: 
synchronized(XX.class){ 
//同步代码 
} 
或 
synchronized public static void accessVa()  
代码同上“奖金”
使用自定义对象作为线程对象锁
 在不同线程中,拥有相同自定义对象中的 synchronized 会互斥。 
语法结构: 
synchronized(自定义对象){
 //同步代码 
}  
可以参考上节银行取款案例
