当给main加上synchronized

1。

在一个同步化的静态方法执行之前,它会获取与它的Class 对象相关联的一个管程(monitor)锁[JLS 8.4.3.6]。
所以在上面的程序中,主线程会在创建第二个线程之前获得与PingPong.class 相关联的那个锁。只要主线程
占有着这个锁,第二个线程就不可能执行同步化的静态方法。具体地讲,在main 方法打印了Ping 并且执行
结束之后,第二个线程才能执行pong 方法。只有当主线程放弃那个锁的时候,第二个线程才被允许获得这
个锁并且打印Pong 。

package com.yinbodotcc;
public class PingPong{
 public static synchronized void main(String[] a)
 {
  Thread t = new Thread()
  {
   public void run(){ pong(); }
  };
  
// t.setDemo(true);
  t.start();
  
  System.out.println( "Ping" );
 }
 static synchronized void pong()
 {
  //while(true)
   System.out.println( "Pong" );
 }

2。如果上面是用t.run()代替t.start()则不是一个多线程了,只是普通方法调用。这个时候打印pong ping

3.上面程序中,我在t.start()上面加入t.setDemo(true),同时pong方法里面用while循环(见红色部分),则
会打印出若干个Pong(不会一个也不打印,也不是一直打印下去)

在Java中,使用synchronized关键字可以实现线程同步,解决脏数据的问题。通过在方法声明中加上synchronized关键字,可以保证多个线程在执行这个方法时的互斥性,即同一时间只有一个线程可以进入该方法进行操作。这样可以避免多个线程同时对共享数据进行修改而导致数据不一致的问题。 下面是一个示例代码: ```java public class MyThread implements Runnable { private int count; public synchronized void run() { for (int i = 0; i < 5; i++) { count++; System.out.println("线程" + Thread.currentThread().getName() + ",count:" + count); } } public static void main(String[] args) { MyThread myThread = new MyThread(); Thread thread1 = new Thread(myThread, "Thread1"); Thread thread2 = new Thread(myThread, "Thread2"); thread1.start(); thread2.start(); } } ``` 在上述代码中,MyThread类实现了Runnable接口,并重写了run方法,并在run方法声明中加上synchronized关键字。通过创建两个线程Thread1和Thread2,并启动这两个线程,我们可以看到两个线程交替执行,保证了count的修改操作的原子性。 需要注意的是,synchronized关键字可以修饰方法、代码块和静态方法,用法有所区别。在本例中我们展示了修饰方法的用法。 除了使用synchronized关键字,还有其他的线程同步方式,如Lock和Semaphore等。但synchronized关键字是最常用且简单的一种方式。可以根据具体需求和场景进行选择和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值