Syncronização em java

Em meu código existe um método que realiza a inserção de dados vindos do clientes e o outro no servidor que inserir os dados nas devidas tabela a partir de um cursor em SQL server. Preciso isolar estes metodos. quando um estiver a inserir o outro aguarda apois a inserção terminar.

public void InserirDaddos(String registo) {
Log inserirDados = new Log();

    PreparedStatement stmt = null;

    Connection con = Conectar.getConnection();

    try {
        con.setAutoCommit(false);
        stmt = con.prepareStatement(registo);
        stmt.execute();
        con.commit();

    } catch (Exception ex) {
        System.out.println("Erro ao salvar" + ex.getMessage());

    } finally {

        Conectar.closseConnection(con, stmt);

    }

}

public void resolucaoConflitos() {

    int diferenca = 0;
   

    try {
       
       
       Conectar.closseConnection(con);
       con = Conectar.getConnection(); 
       
       con.setAutoCommit(false);
        
    
        stmt1 = con.prepareCall("{CALL CONFLITOS()}");
        stmt1.execute();
        con.commit();
               
    } catch (Exception ex) {
        System.out.println("Erro ao resolver conflitos os conflitos " + ex.getMessage());

    } finally {
        
        Conectar.closseConnection(con, stmt);

    }

}

public class sincroniza {

        public sincroniza() {

        }

        public synchronized char inserirDados() {

            while (!disponivel) {
                try {
                    wait();
                   
                } catch (InterruptedException ex) {
                }

            }
            disponivel = false;
            notify();
            return infor;

        }

        public synchronized void reconciliar(char valor) {

            while (disponivel) {

                try {

                    wait();
                     br.resolucaoConflitos();

                } catch (InterruptedException ex) {
                }

            }
            infor = valor;
            disponivel = true;
            notify();

        }

    }

Como são método diferentes, eu faria diferente:

@FunctionalInterface
public interface Comando {
    public void executar();
}

public static void testar() {
    Comando cliente = () ->{
        try {
            System.out.println("Cliente inicia");
            Thread.sleep(3000l);
            System.out.println("Cliente termina");
        } catch(Exception e) {}
    };
    
    Comando servidor = () ->{
        try {
            System.out.println("Servidor inicia");
            Thread.sleep(1500l);
            System.out.println("Servidor termina");
        } catch(Exception e) {}
    };
    
    Thread tc = new Thread(()->{
        int i = 15;
        try {
            while(i > 0) {
                executarComando(cliente, i);
                i -= 1;
                Thread.sleep(500l);
            }
        } catch(Exception e) {}
    });
    tc.start();
    
    Thread ts = new Thread(()->{
        int i = 15;
        try {
            while(i > 0) {
                executarComando(servidor, i);
                i -= 1;
                Thread.sleep(500l);
            }
        } catch(Exception e) {}
    });
    ts.start();
}

public static synchronized void executarComando(Comando c, int i) {
    System.out.println("#indice: "+i);
    c.executar();
}

Ou seja, passaria os comandos para um método synchronized executar.

Acho que para resolver o problema da forma que vc está fazendo, teria que ser assim:

public char inserirDados() {
    synchronized(this) {
        /* .... */
    }
}

public void reconciliar(char valor) {
    synchronized(this) {
        /* .... */
    }
}