1.同一个类的synchronized 锁住的方法,同一时间不能有多个线程同时访问
package com.mercurylake.test.tree;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.sun.swing.internal.plaf.synth.resources.synth;
public class A {
public static void main(String[] args) {
A x=new A();
Runnable r1=new B(x,0);
Runnable r2=new B(x,1);
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
t1.start();
t2.start();
}
public synchronized void a1(){
System.out.println("a1..begin");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("a1..end");
}
public synchronized void b1(){
System.out.println("b1");
}
}
class B implements Runnable{
private A a;
private int mark;
public B(A a, int mark) {
super();
this.a = a;
this.mark = mark;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(mark==0){
a.a1();
}else a.b1();
}
}
返回值:a1..begin ;a1..end ;b1
2.synchronized(this)代码块与 public synchronized void a() 效果相同
package com.mercurylake.test.tree;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.sun.swing.internal.plaf.synth.resources.synth;
public class A {
public static void main(String[] args) {
A x=new A();
Runnable r1=new B(x,0);
Runnable r2=new B(x,1);
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
public synchronized void a1(){
System.out.println("a1..begin");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("a1..end");
}
public void b1(){
synchronized (this) {
System.out.println("b1");
}
}
}
class B implements Runnable{
private A a;
private int mark;
public B(A a, int mark) {
super();
this.a = a;
this.mark = mark;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(mark==0){
a.a1();
}else a.b1();
}
}
输出值与例1中相同
3.synchronized static 用法:锁的不再是实例,而是Class,同一个Class 都会受到同步约束
package com.mercurylake.test.tree;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.sun.swing.internal.plaf.synth.resources.synth;
public class A {
public static void main(String[] args) {
A x=new A();
A y=new A();
Runnable r1=new B(x,0);
Runnable r2=new B(y,1);
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
public synchronized static void a1(){
System.out.println("a1..begin");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("a1..end");
}
public synchronized static void b1(){
System.out.println("b1");
}
}
class B implements Runnable{
private A a;
private int mark;
public B(A a, int mark) {
super();
this.a = a;
this.mark = mark;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(mark==0){
a.a1();
}else a.b1();
}
}
返回值与例1相同