跪求!JAVA中,关于多线程的疑惑,求解答大佬们有什么好的建议?

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);
}
@Override
publicvoidrun(){
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{
@Override
publicvoidrun(){
synchronized(Thread.class){
for(inti=0;i<100;i++){
intvalue=Test.getValue();
++value;
Test.setValue(value);
}
}
}
}
描述以及之后的修改
按照一样的思路,这里我修饰的是Test.class对象,测试结果不一致之后尝试将bean的get/set方法也使用synchronized修饰,发现得到的结果依然不一致
开始怀疑自己的理解有问题
难道sychronized不是将访问的线程都自进入该对象时就加上锁吗???
求指点,万分感谢
婷婷同学_
浏览 313回答 2
2回答

慕森卡

后面这段代码?哪里加锁了?synchronized的目的是保证代码块的原子性操作以synchronized来锁住当前对象保证并发访问的原子性,但是也让我产生了疑惑,为什么一定要访问本类中的变量,这句话就很莫名?完全看不懂你想问什么
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript