synchorized

下面代码为整体的所有代码,所有代码的改动以下面原代码为例。
原:
class Sync {
public synchronized void test(){
System.out.println(“test开始”);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(“test结束”);
}
}

class MyThread extends Thread{
private Sync sync;
public MyThread(Sync sync){
this.sync = sync;
}

@Override
public void run(){
sync.test();
}
}

public class Main{
public static void main(String[] args){
Sync sync = new Sync();
for(int i = 0; i < 3; i++){
Thread thread = new MyThread(sync);
thread.start();
}
}
}
上面代码中的Thread在执行的时候,公用一个sync对象,所以一个线程获得该对象锁之后,其它线程必须等待。
上述代码的运行结果为
在这里插入图片描述
如果将原代码稍加改动,改为如下
public class Main{
public static void main(String[] args){
Sync sync = new Sync();
for(int i = 0; i < 3; i++){
Thread thread = new MyThread(new Sync());
thread.start();
}
}
}
结果变为
在这里插入图片描述
这是因为每个线程访问不同的sync实例,一个线程在获得了sync对象的锁之后,其它线程还可以获得又一个sync对象的锁。

下面对原代码改动,将同步关键字加在代码块上,结果也会发生变化
class Sync {
public void test(){
synchronized (this){
System.out.println(“test开始”);
}
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(“test结束”);
}
}
在这里插入图片描述
这是因为同步代码块只能锁定同步当前范围,并不会锁定test()方法,所有三个线程都可以进入到test()方法中,并发的输出“test开始”。

猜你喜欢

转载自blog.csdn.net/change1world/article/details/83819416