同步块为类不工作

时间:2018-01-30 10:30:30

标签: java multithreading

我在多线程环境中有以下代码:

   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)));
                }

2 个答案:

答案 0 :(得分:0)

  

根据我的理解,类本身的synchronized块确保一个线程为所有实例执行块。

是,但仅当 c的每次访问都在同一对象上进行同步时。

  

我做错了什么?

其他一些线程可能正在更改c而没有同步或正在同步其他内容。

答案 1 :(得分:0)

我相信您在提供的代码段之外的某处打印c(用于调试或其他目的)。因此,我们会看到c的中间值或最终值不满足条件c % 100 == 0