Evitar bloques sincronizados en código java

Estoy trabajando en un componente simple donde mi clase contiene una referencia a un objeto que admite operaciones de agregar y una función de envío.
Una vez que se llama a la función de envío, el objeto al que se hace referencia debe reemplazarse por uno nuevo. Mi API admite operaciones de agregar que envían el artículo una vez que alcanzó un tamaño de certificación, PERO en algunos casos tendré que verificar que un artículo se haya enviado independientemente de su tamaño después de un tiempo. La única solución que se me ocurre es sincronizar toda la clase, lo que me gustaría evitar. ¿Alguna idea de otras soluciones / posibles refactorizaciones para evitar sincronizar todo?

pulic class MyClass{
        private MyObject ref;
        private int maxObjectsToSubmit;

        public MyClass(int maxItems){ 
              this.maxObjectsToSubmit = maxItems;
        }

        public void add(Item obj){
              ref.add(obj);
              if(ref.size() == maxObjectsToSubmit){
                   submit();
              }else if(obj.isVeryImportant()){
                    SomeAPI.runThreadInExactDelayToCreateRaceCondition(new Runnable{ 
                     public void run(){
                          //Submit only if o is still waiting to be submittet.
                     // if ref does not contains obj than it has already been submitted
                         if(ref.contains(obj)){
                           submit()
                         }
                  })
             }
        }

           private void submit(){
                 SomeAPI.doSomething(ref);
                 this.ref = new MyObject();
            }
}

La condición de la carrera es:

  1. T1 agrega algunos elementos hasta que llega un elemento muy impactante, que inicia T2
  2. T1 alcanza maxObjectsToSubmit y ref.size () == maxObjectsToSubmit devuelve verdadero
  3. T2 comienza, ref.contains (obj) devuelve verdadero

Esto puede provocar que se envíe un objeto vacío / El mismo objeto se envíe dos veces / etc.

Respuesta 1

Estoy desarrollando una aplicación JAVA SWING, y cuando hago clic en un botón, y quiero que abra una página del navegador con los campos del formulario HTML completamente llenos (con los datos que quiero pasar de JAVA ...

Estoy tratando de mostrar los registros en JTable cuando se carga el marco, pero los registros no se muestran. Esto es lo que he probado hasta ahora: public void load () {try {Connection con1; ...

He creado un software que genera un pdf como parte de su función, estoy usando la biblioteca iTextPDF Java para generar PDF. Para una versión demo de mi software, agregué marcas de agua de texto (como "demo ...

Resumen ¿Cómo se obtiene la sesión de un cliente de servicios web que utiliza servicios web de Spring y Spring Security? Detalles después de enviar <form method = "POST" action = "<c: url value =" / ...