使用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(自定义对象){
//同步代码
}
可以参考上节银行取款案例
