线程中Synchronized关键字问题

Java中每一个对象都有一个默认的锁或者是监视器(monitor),当访问某个对象的Synchronized方法的时候,表示将该对象上锁,这时候任何的线程都无法访问这个Synchronized方法了,直到该线程运行完毕或者发生异常的时候,该线程会释放锁。

public class ThreadTest4

{
public static void main(String[] args)
{
SynchTest st=new SynchTest();

Thread t1=new SynchThread1(st);

//st=new SynchTest();

Thread t2=new SynchThread2(st);

t1.start();

t2.start();
}
}
class SynchTest
{
public synchronized  void calc() 
{
for (int i = 0; i < 20; i++)
{
System.out.println("hello:"+i);
}
}

public synchronized  void calc2() 
{
for (int i = 0; i < 20; i++)
{
System.out.println("world:"+i);
}
}
}
class SynchThread1 extends Thread
{
private SynchTest st;


public SynchThread1(SynchTest st)
{
super();
this.st = st;
}

@Override
public void run()
{
// TODO Auto-generated method stub
super.run();
st.calc();
}
}
class SynchThread2 extends Thread
{
private SynchTest st;


public SynchThread2(SynchTest st)
{
super();
this.st = st;
}

@Override
public void run()
{
// TODO Auto-generated method stub
super.run();
st.calc2();
}

}


输出:

hello:0
hello:1
hello:2
hello:3
hello:4
hello:5
hello:6
hello:7
hello:8
hello:9
hello:10
hello:11
hello:12
hello:13
hello:14
hello:15
hello:16
hello:17
hello:18
hello:19
world:0
world:1
world:2
world:3
world:4
world:5
world:6
world:7
world:8
world:9
world:10
world:11
world:12
world:13
world:14
world:15
world:16
world:17
world:18

world:19

因为他们是同一个对象对线程方法的调用,因为是sybchronized方法,所以第一个对象引用的时候,对象上锁,第二个对象是无法进行访问的,所以先顺序的执行完第一个方法,然后再执行第二次。

重点:Thread t1=new SynchThread1(st);
//st=new SynchTest();

Thread t2=new SynchThread2(st);

如果在中间执行了st=new SynchTest();则会乱序,因为他们不是同一个对象了,都有自己的线程synchronized方法,谁强到的资源多谁执行!

阅读更多
上一篇实现线程的第二种方法:实现了Runnable接口
下一篇AWT学习目标
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭