class ThreadSix extends Thread{
ThreadSix(){
start();
}
public void run(){
playA();
playB();
}
synchronized static void playA(){
{
System.out.println("playA = "+TestThread.playA );
TestThread.playA++;
}
}
void playB(){
synchronized(ThreadSix.class){
System.out.println("playB = "+TestThread.playB);
TestThread.playB++;
}
}
}输出如下:playA = 0
playB = 0
playA = 1
playB = 1
playA = 2
playA = 3
playB = 2
playA = 4
playB = 2
playB = 3
playA = 5
playB = 5在网上找到的解释:代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。
第一段说同步的static方取得的锁是对象所属类,第二段又说A方法锁的是Obj对象
这不是前后矛盾吗?我觉得两个方法都应该属于Class锁吧?
那为什么他们之间不互相同步呢,如果想让这2个方法互相之间也同步,形成以下输出。应该怎么办?playA = 0
playB = 0
playA = 1
playB = 1
playA = 2
playB = 2
playA = 3
playB = 3
playA = 4
playB = 4
playA = 5
playB = 5
主函数 什么都没有 程序不全啊
public class TestThread { public static int play1 = 0;
public static int play2 = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0; i < 6; i++){
new ThreadSix();
}
}}
主类在这里。。有哪里说不清楚么 没人回
class ThreadSix extends Thread{
ThreadSix(){
start();
}
public void run(){
playA();
playB();
}
synchronized static void playA(){
System.out.println("playA = "+TestThread.playA +",name="+ Thread.currentThread().getName());
TestThread.playA++;
}
void playB(){
synchronized(ThreadSix.class){
System.out.println("playB = "+TestThread.playB +",name="+ Thread.currentThread().getName());
TestThread.playB++;
}
}
}
public class TestThread {
public static int playA = 0;
public static int playB = 0;
public static void main(String[] args) {
for(int i = 0; i < 6; i++){
try{
new ThreadSix().join();//等待线程结束
Thread.sleep(10);
}catch(Exception e){
}
}
}
}
synchronized static和synchronized(Class)是等效的
run方法里执行两个方法palyA,playB,在这两个方法之间,有时间分配间隙,也就说一个线程,不能保证playA执行结束以后,马上就执行playB,因为线程的调度是系统决定的,也就说线程的CPU分配是系统决定。
这样当一个线程执行playA后(还没来得及执行playB),系统就把CPU收回,分配给另一个线程,此时因为前一个线程的playA执行结束,synchronized锁已释放,后一个线程的run是可以进入playA方法的,于是就会有playA,playA输出
如果要到一个playA,一个playB,两者之间就需要保证没有时间分配间隙,所以把playB写到playA中即可
建议LZ看下这个。http://www.javaeye.com/topic/164905