使用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;
}
@Override
public void run() {
this.p.openConputer();
}
}
/**
* 代码线程
*/
class Working2 extends Thread{
private Programer p;
public Working2(Programer p){
this.p=p;
}
@Override
public void run() {
this.p.coding();
}
}
/**
*去厕所县城他
*/
class Working3 extends Thread{
private Programer p;
public Working3(Programer p){
this.p=p;
}
@Override
public void run() {
this.p.wc();
}
}
/**
* 程序员领取奖金
*/
class ProgrammerMoney extends Thread{
private Programer p;
public ProgrammerMoney(Programer p){
this.p = p;
}
@Override
public 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;
}
@Override
public 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(自定义对象){
//同步代码
}
可以参考上节银行取款案例