多线程静态方法同步
2015-03-18 13:27
141 查看
多线程静态方法同步
public class StaticSynTest extends Thread {
StaticMothod sm;
public StaticSynTest(StaticMothod sm){
this.sm = sm;
}
public static void main(String[] args) {
StaticMothod sm1 = new StaticMothod();
StaticSynTest sst1 = new StaticSynTest(sm1);
StaticSynTest sst2 = new StaticSynTest(sm1);
StaticSynTest sst3 = new StaticSynTest(sm1);
sst1.setName("sst1");
sst2.setName("sst2");
sst3.setName("sst3");
sst1.start();
sst2.start();
sst3.start();
}
public void run(){
this.sm.b(Thread.currentThread().getName());
this.sm.b1(Thread.currentThread().getName());
StaticMothod.a(Thread.currentThread().getName());
StaticMothod.a1(Thread.currentThread().getName());
}
}
class StaticMothod{
public synchronized static void a(String name){
System.out.println(name+":a in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":a out");
}
public synchronized static void a1(String name){
System.out.println(name+":a1 in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":a1 out");
}
public synchronized void b(String name){
System.out.println(name+":b in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":b out");
}
public synchronized void b1(String name){
System.out.println(name+":b1 in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":b1 out");
}
}
输出结果为:
sst1:b in
sst1:b out
sst2:b in
sst2:b out
sst3:b in
sst3:b out
sst1:b1 in
sst1:b1 out
sst1:a in
sst2:b1 in
sst1:a out
sst1:a1 in
sst2:b1 out
sst3:b1 in
sst3:b1 out
sst1:a1 out
sst2:a in
sst2:a out
sst3:a in
sst3:a out
sst2:a1 in
sst2:a1 out
sst3:a1 in
sst3:a1 out
结论:
1、当前线程调用类的同步静态方法时,其它线程可以进入该类实例的其它非静态方法,不能进入类的其它静态方法。
2、同理,当前进入同步的实例方法时,其它线程可以进入该类的静态方法,但是不能进入该类的其它非静态方法。
原因:静态方法同步是获取StaticSynTest.class锁,而实例方法获取的是该“实例对象”的锁,它们互不干涉。
public class StaticSynTest extends Thread {
StaticMothod sm;
public StaticSynTest(StaticMothod sm){
this.sm = sm;
}
public static void main(String[] args) {
StaticMothod sm1 = new StaticMothod();
StaticSynTest sst1 = new StaticSynTest(sm1);
StaticSynTest sst2 = new StaticSynTest(sm1);
StaticSynTest sst3 = new StaticSynTest(sm1);
sst1.setName("sst1");
sst2.setName("sst2");
sst3.setName("sst3");
sst1.start();
sst2.start();
sst3.start();
}
public void run(){
this.sm.b(Thread.currentThread().getName());
this.sm.b1(Thread.currentThread().getName());
StaticMothod.a(Thread.currentThread().getName());
StaticMothod.a1(Thread.currentThread().getName());
}
}
class StaticMothod{
public synchronized static void a(String name){
System.out.println(name+":a in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":a out");
}
public synchronized static void a1(String name){
System.out.println(name+":a1 in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":a1 out");
}
public synchronized void b(String name){
System.out.println(name+":b in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":b out");
}
public synchronized void b1(String name){
System.out.println(name+":b1 in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":b1 out");
}
}
输出结果为:
sst1:b in
sst1:b out
sst2:b in
sst2:b out
sst3:b in
sst3:b out
sst1:b1 in
sst1:b1 out
sst1:a in
sst2:b1 in
sst1:a out
sst1:a1 in
sst2:b1 out
sst3:b1 in
sst3:b1 out
sst1:a1 out
sst2:a in
sst2:a out
sst3:a in
sst3:a out
sst2:a1 in
sst2:a1 out
sst3:a1 in
sst3:a1 out
结论:
1、当前线程调用类的同步静态方法时,其它线程可以进入该类实例的其它非静态方法,不能进入类的其它静态方法。
2、同理,当前进入同步的实例方法时,其它线程可以进入该类的静态方法,但是不能进入该类的其它非静态方法。
原因:静态方法同步是获取StaticSynTest.class锁,而实例方法获取的是该“实例对象”的锁,它们互不干涉。
相关文章推荐
- 多线程静态方法同步
- java多线程之-----静态同步synchronized方法与synchronized(class) 代码块
- 多线程陷阱(不要调用run方法;静态的同步方法)
- 从头认识多线程-2.16 同步静态方法和静态代码块
- 多线程之静态同步函数/方法
- (Java多线程)分析静态方法所适用的同步监视器对象是什么?
- Java多线程 6 静态同步方法的锁
- JavaSE8基础 多线程synchronized 同步静态方法的锁
- 从头认识多线程-2.17 同步方法与同步静态代码块持有的是不同的锁
- 多线程有几种实现方法?同步有几种实现方法?静态同步方法和非静态有何不同?—— Java经典面试题系列
- java 多线程10:synchronized锁机制 之 锁定类静态方法 和锁定类.Class 和 数据String的常量池特性 同步静态方法
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
- JAVA静态方法同步
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- 多线程(三)同步块与同步方法
- Delphi Dll中多线程无法使用Synchronize同步的解决方法(转)
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- 五 C# 多线程研究 使用Mutex类来同步方法及其与Monitor类和Lock之间的区别
- 初学Java多线程:使用Synchronized关键字同步类方法
- C# 实现多线程的同步方法详解