我想请问哪位大神可以帮我详细解释一下下面的java代码?

懒得仔细看,大概是从1加到100给点建议:1. Accumulator改名为AccumulatorThread,让大家知道它是个thread,或改成Runnable;2. start你拼错了;3. static int让你的Accumulator用处受限(再跑一遍起始值就不对了,是吧?)建议改成构造方法的入参,如:int 入或者一个IntWrapper,synchronized可以只同步该入参;4. for循环里的+=startNum+i建议改成两句,别这么玩;
■网友
程序从main方法开始执行,new 了一个Thread数组,大小为10 下面一个for循环,循环十次,创建了10个线程注意new Accumulator(10*i+1);传入的参数,i=0 时 传入的是1 类推,2 3 4 5 .... 也就是创建了10个线程,但是传入的参数不一样。那么线程里都做了什么呢?public void run() {\t\tint sum = 0;\t\tfor (int i = 0; i \u0026lt; 10; i++) {\t\t\tsum += stratNum + i;\t\t}\t\tadd(sum);\t}就是从1+2...+10。当然i的初始值是你创建线程的时候传入的,这里传入的分别是1,11,21,31...91(一共是10个线程)这回知道他是做什么的了吧。也就是计算从1加到100。结果不用自己计算应该是5050了吧。小学生都会计算。这里有一个面试时会经常问到的基础知识,启动一个新线程如何启动,调用start()方法还是run方法?答案当然是调用start方法。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。但是,你在看add方法,public static synchronized void add 关键字synchronized 是给这个方法加锁了,也就是所谓的线程同步,意思就是这个方法一次只能被一个线程使用,那么main方法里创建了10个线程,难道是是1加到100分成10个任务一起计算?效率更快?add方法加了一个synchronized保护就没有什么卵用了。如楼上所说,除了装逼就没什么卵用了。面试题应该也不会出这样的问题。因为没有考点,反正我是没看出来。但是从这个题目渗透出来的java基础知识还是有一些。关于synchronized 总结有以下几点你们可以看看。基础概念:Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有另一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
进一步深入:
1、synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。


推荐阅读