我在多线程环境中有以下代码:
static int c=0;
..
..
Scanner fileContent = new Scanner(this.content);
while (fileContent.hasNextLine()) {
fileContent.nextLine();
synchronized (SameClassWhereCodeResides.class) {
c=c+1;
if(c%100==0)
System.out.println(c);
}
}
我得到的结果不是100的倍数。根据我的理解,类本身的synchronised
块确保一个线程为所有实例执行块。我做错了什么?
更新: 这是完整的代码
public class CallRestServiceWorker extends S3Client implements Runnable {
public CallRestServiceWorker(S3ObjectSummary s3ObjectSummary) {
this.s3ObjectSummary = s3ObjectSummary;
}
static int c=0;
@Override
public void run() {
AmazonS3 s3cli = this.getS3Client();
S3Object s3FileObject = s3cli
.getObject(new GetObjectRequest(this.s3ObjectSummary.getBucketName(), this.s3ObjectSummary.getKey()));
Scanner fileContent = new Scanner(s3FileObject.getObjectContent());
int counter = 0;
while (fileContent.hasNextLine()) {
fileContent.nextLine();
synchronized (CallRestServiceWorker.class) {
c=c+1;
if(c%100==0)
System.out.println(c);
}
}
}
在主线程中,我有一个执行程序服务
executor = Executors.newFixedThreadPool(10);
for (S3ObjectSummary objectSummary : result.getObjectSummaries()) {
this.futures.add(executor.submit(new CallRestServiceWorker(objectSummary)));
}
答案 0 :(得分:0)
根据我的理解,类本身的synchronized块确保一个线程为所有实例执行块。
是,但仅当 c
的每次访问都在同一对象上进行同步时。
我做错了什么?
其他一些线程可能正在更改c
而没有同步或正在同步其他内容。
答案 1 :(得分:0)
我相信您在提供的代码段之外的某处打印c
(用于调试或其他目的)。因此,我们会看到c
的中间值或最终值不满足条件c % 100 == 0
。