JAVA中,关于多线程的疑惑疑惑来源于网上文章的阅读,和自己的测试来源于网上的测试代码publicclassRunnable1implementsRunnable{privatestaticintcount=0;publicstaticvoidmain(String[]args){for(inti=0;i<10;i++){Threadthread=newThread(newRunnable1());thread.start();}try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("result:"+count);}@Overridepublicvoidrun(){synchronized(this){for(inti=0;i<10000;i++){count++;}}}}描述该文章是一个描述synchronized关键字的文章,文章说对于count这个共享变量,以synchronized来锁住当前对象保证并发访问的原子性,但是也让我产生了疑惑,为什么一定要访问本类中的变量,如果线程访问一个普通的类,比如user(举例而已)这样的javabean对象,由于javabean中的属性都是私有的,那么只能通过get/set方法访问,那么如果我锁住的是该bean的class对象是否可以保证,并发访问的正确性呢?我做了测试,代码如下publicclassTest{privatestaticintvalue=0;publicstaticintgetValue(){returnvalue;}publicstaticvoidsetValue(intvalue){Test.value=value;}publicstaticvoidmain(String[]args){ThreadFactoryfactory=newThreadFactoryBuilder().setNameFormat("threadPool-%d").build();ThreadPoolExecutorpoolExecutor=newThreadPoolExecutor(10,10,60L,TimeUnit.SECONDS,newLinkedBlockingQueue<>(10),factory,newThreadPoolExecutor.AbortPolicy());poolExecutor.execute(newThread1());poolExecutor.execute(newThread1());poolExecutor.execute(newThread1());poolExecutor.execute(newThread1());poolExecutor.execute(newThread1());poolExecutor.shutdown();System.out.println(value);}}publicclassThread1extendsThread{@Overridepublicvoidrun(){synchronized(Thread.class){for(inti=0;i<100;i++){intvalue=Test.getValue();++value;Test.setValue(value);}}}}描述以及之后的修改按照一样的思路,这里我修饰的是Test.class对象,测试结果不一致之后尝试将bean的get/set方法也使用synchronized修饰,发现得到的结果依然不一致开始怀疑自己的理解有问题难道sychronized不是将访问的线程都自进入该对象时就加上锁吗???求指点,万分感谢
慕森卡
相关分类