关键字synchronized方法方法上修饰,那么该方法就是同步方法。
同步方法分为 :非静态同步方法和静态同步方法。
代码如下:
非静态同步方法
package sx.test.thread;
public class Demo4 {
public static void main(String[] args) {
final Print2 p = new Print2();
//匿名内部类
new Thread("线程1---"){
public void run() {
for(int i=0;i<20;i++){
p.print1();
}
}
}.start();
//匿名内部类
new Thread("线程2---"){
public void run() {
for(int i=0;i<20;i++){
p.print2();
}
}
}.start();
}
}
class Print2{
//无论是同步代码块还是同步方法,他们必须要保证锁对象是一致的。
Demo4 d = new Demo4();
public synchronized void print1(){
System.out.print("床");
System.out.print("前");
System.out.print("明");
System.out.print("月");
System.out.print("光");
System.out.print("\r\n");
}
public void print2(){
synchronized(this){ //非静态同步方法的锁对象必须是this
System.out.print("疑");
System.out.print("似");
System.out.print("地");
System.out.print("上");
System.out.print("霜");
System.out.print("\r\n");
}
}
}
静态同步方法
package sx.test.thread;
public class Demo5 {
public static void main(String[] args) {
final Print3 p = new Print3();
//匿名内部类
new Thread("线程1---"){
public void run() {
for(int i=0;i<20;i++){
p.print1();
}
}
}.start();
//匿名内部类
new Thread("线程2---"){
public void run() {
for(int i=0;i<20;i++){
p.print2();
}
}
}.start();
}
}
class Print3{
//无论是同步代码块还是同步方法,他们必须要保证锁对象是一致的。
Demo5 d = new Demo5();
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(){
//静态同步方法的锁对象是类名.class
synchronized(Print3.class){ //静态方法随着类的加载而加载,而类的加载是有对象的,即类的字节码对象:类名.class
System.out.print("疑");
System.out.print("似");
System.out.print("地");
System.out.print("上");
System.out.print("霜");
System.out.print("\r\n");
}
}
}