同步方法
-
使用synchronized关键字修饰一个方法,该方法中所有的代码都是同步的。
非静态的同步方法的锁对象是神马?
答:非静态的同步方法的锁对象是this
静态的同步方法的锁对象是什么?为什么?
答:是该类的字节码对象。静态是优先于对象而存在的,静态方法中是不能定义this和super的,只有当你创建对象的时候this才有值。class Printer { public static void print1() { //锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象 synchronized(Printer.class){ System.out.print("黑"); System.out.print("马"); System.out.print("程"); System.out.print("序"); System.out.print("员"); System.out.print("\r\n"); } } /* * 非静态同步函数的锁是:this * 静态的同步函数的锁是:字节码对象 */ public static synchronized void print2() { System.out.print("传"); System.out.print("智"); System.out.print("播"); System.out.print("客"); System.out.print("\r\n"); } }
package com.heima.syn;
public class Demo02_Synchronized {
/**
* @param args
* 同步代码块
*/
public static void main(String[] args) {
final Printer2 p = new Printer2();
new Thread() {
public void run() {
while(true) {
p.print1();
}
}
}.start();
new Thread() {
public void run() {
while(true) {
p.print2();
}
}
}.start();
}
}
class Printer2 {
//同步方法只需要在方法上加synchronized关键字即可
public static synchronized void print1() {
System.out.print("黑");
System.out.print("马");
System.out.print("程");
System.out.print("序");
System.out.print("员");
System.out.print("\r\n");
}
public static void print2() {
synchronized(Printer2.class) {
System.out.print("传");
System.out.print("智");
System.out.print("播");
System.out.print("客");
System.out.print("\r\n");
}
}
}