java线程中加入synchronized锁住方法,但无效,请看代码

u010584807 u010584807 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这是我写的一段测试代码
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

weixin_38607554

【网络安全 | Java】synchronized锁住的是代码还是对象?

方法或块时,它会获得该对象的锁,其他线程在获得锁之前无法进入任何同步的代码块。上面的做法是所有线程共享同一个 Sync 对象,如果想每个线程创建一个对象并避免多线程并发,就需要锁住代码段,这可以在。只有当第一个线程释放锁后,其他线程才能获取锁并继续执行,从而实现线程同步。即便是两个不同的代码段,如果都对同一个对象加锁,那么这两个代码段在多线程环境下也无法同时运行。当一个线程获取了对象锁,其他线程在获得该对象锁之前,无法访问任何被。是唯一的,这种方法达到了全局锁的效果,确保只有一个线程可以进入。

秋说

java中synchronized(同步代码块和同步方法)详解及区别

主要介绍了 java中synchronized(同步代码块和同步方法)详解及区别的相关资料,需要的朋友可以参考下

weixin_38613330

Java并发 synchronized锁住的内容解析

主要介绍了Java并发 synchronized锁住的内容解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

weixin_38593380

解析Java编程之Synchronized锁住的对象

主要介绍了解析Java编程之Synchronized锁住的对象,具有一定参考价值,需要的朋友可以了解下。

weixin_38518006
评论 10
收藏 已收藏
分享
返回顶部
u010584807
Web 开发 81,108 成员 341,721 内容