java多线程问题总结

1、synchronized关键字修饰的同步函数使用什么对象作为锁?

分为两种情况,如果该函数为静态的则采用所在类的class锁,否则采用this锁,测试用例如下:

class test{
	public synchronized void f1() throws InterruptedException{  
		System.out.println("进入f1");
		Thread.sleep(5000);
		System.out.println("离开f1");
	}
	
	public void f2(){
	      synchronized (this){
		System.out.println("进入f2");
	      }
	}
}

public class thread{
       public static void main(String[] args) throws InterruptedException {
       test t=new test();   
       Thread t1=new Thread(new Runnable() {
		  @Override
		  public void run() {
			t.f1();
		  }
	    });

       Thread t2=new Thread(new Runnable() {
		 @Override
		 public void run() {
			t.f2();
		 }
	   });
       
       t1.start();
       t2.start();
   } 
}
输出结果:
进入f1
离开f1
进入f2
我们可以看到,只有当线程t1释放锁后,线程t2才能进入f2,说明同步方法和同步代码块采用的是同一个this锁,class锁的测试则给f1添加static关键字,f2使用test.class锁。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多线程结果汇总是指将多个线程并发执行的结果进行汇总和合并。在多线程编程中,我们常常需要将每个线程的计算结果进行累加、合并或者统计等操作,从而得到最终的结果。 一种常见的做法是使用线程池来管理线程的执行。我们可以将任务分解为多个子任务,每个子任务由一个线程来执行。线程池会自动管理线程的创建、执行和销毁,确保我们可以高效地使用线程资源。每个线程计算完毕后,将结果返回给线程池,线程池就可以将这些结果进行合并、汇总,得到最终的结果。 另一种常见的方法是使用Future和Callable来获取线程的执行结果。Callable是一个带有返回值的任务,我们可以使用它来定义每个子任务的逻辑。将Callable提交给线程池后,会返回一个Future对象,我们可以通过该对象获取线程执行的结果。Future提供了方法来判断任务是否已经完成、获取任务的结果等操作。通过迭代每个Future对象,可以将所有的结果进行汇总和合并。 除了线程池和Future,还可以使用线程间的通信来实现结果汇总。比如,可以使用共享变量、信号量、锁等机制来实现各个线程之间的同步和通信。每个线程将计算结果保存在共享变量中,其他线程根据需要读取这些结果,并在必要时进行合并。 无论使用哪种方法,Java多线程结果汇总都需要考虑线程安全性。多个线程同时操作共享的数据结构,可能会引发并发问题,如线程安全、死锁等。为了保证结果的正确性和一致性,我们需要使用适当的同步机制来确保线程的顺序执行和结果的正确性。 总之,通过线程池和Future、线程间通信等手段,可以有效地实现Java多线程结果的汇总和合并,从而提高程序的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值