java线程中加入synchronized锁住方法,但无效,请看代码
public class SynchronizedCode implements Runnable {
private int aa;
public SynchronizedCode(int aa){
this.aa = aa;
}
public void run() {
synchronized (this){
try {
System.out.println("@@"+aa);
Thread.sleep(aa);
System.out.println("----"+aa);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
SynchronizedCode sc1 = new SynchronizedCode(2000);
SynchronizedCode sc2 = new SynchronizedCode(1000);
Thread thread1 = new Thread(sc1);
Thread thread2 = new Thread(sc2);
thread1.start();
thread2.start();
}
}运行main方法后,打印的结果为:
@@1000
@@2000
----1000
----2000
为什么?
有synchronized 包住的代码块,应该是等第一个执行完了,第二个才能执行啊?
我想的结果应该是:
@@1000
----1000
@@2000
----2000
很奇怪啊!
如果说想输出为:
@@1000
----1000
@@2000
----2000
该如何做?希望大家能指点一二!
相关推荐
Java:synchronized锁住的是代码还是对象
在Java中,synchronized关键字是用来控制线程同步的,是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。Synchronized既可以对代码块使用,也可以加在整个方法上。 关键是,不要认为给方法或者代码段加上synchronized万事大吉,看下面一段代码: class Sync { public synchronized void test() { System.out.println("test开始.."); try { Thread.sleep(1000); } catch (InterruptedExce
【网络安全 | Java】synchronized锁住的是代码还是对象?
方法或块时,它会获得该对象的锁,其他线程在获得锁之前无法进入任何同步的代码块。上面的做法是所有线程共享同一个 Sync 对象,如果想每个线程创建一个对象并避免多线程并发,就需要锁住代码段,这可以在。只有当第一个线程释放锁后,其他线程才能获取锁并继续执行,从而实现线程同步。即便是两个不同的代码段,如果都对同一个对象加锁,那么这两个代码段在多线程环境下也无法同时运行。当一个线程获取了对象锁,其他线程在获得该对象锁之前,无法访问任何被。是唯一的,这种方法达到了全局锁的效果,确保只有一个线程可以进入。
java中synchronized(同步代码块和同步方法)详解及区别
主要介绍了 java中synchronized(同步代码块和同步方法)详解及区别的相关资料,需要的朋友可以参考下
Java并发 synchronized锁住的内容解析
主要介绍了Java并发 synchronized锁住的内容解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
解析Java编程之Synchronized锁住的对象
主要介绍了解析Java编程之Synchronized锁住的对象,具有一定参考价值,需要的朋友可以了解下。


Web 开发
