synchronized的用法

来源:百度知道 编辑:UC知道 时间:2024/06/09 13:12:36
小程序代码如下:

public class Training{
public static void main(String ars[])throws IOException
{
Test t = new Test();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
}

class Test implements Runnable{
static Integer count = 0;
public int flag = 1;
public void run(){
if (flag==0)
m2();
else
m1();
}
public synchronized void m1(){
// count = 1;
flag = 0;
for(int i = 0;i < 50; i++){
count++;
System.out.println("m1's printing : count = "+count);
}
}
public void m2(){
// count = 0;
synchronized(count){
count = 2;
for(int i = 0;i < 50; i++)
System.out.println("m2's printing : count = "+count);
}
count = 3;
}
}

本来觉得应该是m1先输出结束,m2再开始输出,或者m1输出几个,然后m2输出完,然后m1继续。可结果却是两者轮流输出(由于

synchronized修饰的函数是以所在类对象(Class对象)为锁的
而你synchronized语句用的count 所以自然两个互不相干

-

你貌似对锁的概念还不清楚|||

锁只是是防止两个线程(不是叫进程,进程是操作系统的概念)同时访问一个数据。而不是直接不让其他线程改这个数据。只有两个线程同时获取一个锁的时候才能达到这个效果。

说浅显点的话。比如线程A正大光明地说,我要使用count。这个时候线程B也正大光明地说,我要使用count。线程B就要等待线程A说我不用了,他才能用。这就是如果两个线程都在synchronized(count)中的情况。

但是如果线程B偷偷摸摸地去用count,线程A什么办法也没有。这就是线程A在synchronized(count)中而线程B没在synchronized(count)中但也在写count的情况。

你现在是两个线程一个在synchronized(Test)一个在synchronized(count)里一个说我要用Test类,一个说我要用count。自然用就用了。虽然前者其实也在用count,但是瞒天过海了。