JavaRush /Blog Java /Random-ES /Pausa para el café #171. Cómo utilizar la palabra clave s...

Pausa para el café #171. Cómo utilizar la palabra clave sincronizada. Manejo de archivos en Java

Publicado en el grupo Random-ES

Cómo utilizar la palabra clave sincronizada

Fuente: Medio Hoy aprenderá en qué casos y cómo utilizar correctamente la palabra clave sincronizada en el lenguaje de programación Java. Pausa para el café #171.  Cómo utilizar la palabra clave sincronizada.  Procesamiento de archivos en Java - 1Los modificadores son ciertas palabras clave presentes en Java con la ayuda de las cuales podemos realizar cambios en las características de una variable, método o clase y limitar su alcance. El lenguaje Java tiene un conjunto bastante grande de modificadores. Los modificadores en Java se dividen en dos tipos: modificadores de acceso y modificadores sin acceso.

Modificadores sin acceso

Los modificadores no accesibles proporcionan a la JVM información sobre las características de una clase, método o variable. Hay siete tipos de modificadores sin acceso en Java:
  • final
  • estático
  • abstracto
  • sincronizado
  • volátil
  • transitorio
  • nativo
En este artículo, analizaremos más de cerca la palabra clave sincronizada . Primero, definamos dónde y cuándo usarlo.

¿En qué casos se utiliza sincronizado?

En Java, la palabra clave sincronizada se utiliza para proporcionar control de acceso a un método o bloque de código. Cuando un hilo intenta ejecutar un método sincronizado o un bloque de código, primero debe adquirir un bloqueo. Una vez que haya recibido el candado, puede comenzar la ejecución. Sin embargo, cualquier otro hilo que intente ejecutar el mismo método sincronizado o bloque de código será bloqueado hasta que el primer hilo libere el bloqueo. Esto garantiza que solo un subproceso pueda ejecutar código a la vez, lo cual es importante para mantener la integridad de los datos. La palabra clave sincronizada se puede utilizar con métodos estáticos y no estáticos, así como con bloques de código.
  • Cuando se usa con métodos estáticos, todos los subprocesos compiten por el mismo bloqueo. Esto puede afectar el rendimiento, por lo que es mejor evitar sincronizar métodos estáticos a menos que sea absolutamente necesario.

  • Cuando se usa con métodos no estáticos, cada instancia de la clase tendrá su propio bloqueo, por lo que varios subprocesos pueden ejecutar simultáneamente código sincronizado desde diferentes instancias. Este suele ser el enfoque preferido.

  • Cuando se usa con bloques de código, se adquiere un bloqueo en un objeto que se pasa a la declaración sincronizada . Esto permite que varios subprocesos ejecuten simultáneamente bloques sincronizados de código de diferentes objetos.

Por tanto, la palabra clave sincronizada es una herramienta poderosa para controlar el acceso simultáneo a datos en aplicaciones Java. Cuando se usa correctamente, puede ayudar a garantizar la integridad de los datos y mejorar el rendimiento.

Ejemplos de uso

1. bloque sincronizado

public class Counter {
  private int count = 0;

  public int getCount() {
    synchronized (this) {
      return count;
    }
  }

  public void increment() {
    synchronized (this) {
      count++;
    }
  }
}
Aquí hay dos bloques de código que acceden al contador. El más simple de ellos es el método get , que simplemente lee el valor. A primera vista, el método de incremento parece contener una línea de código. Pero recuerde que la operación de incremento debe leer el valor actual, agregarle uno y escribir el nuevo valor en la memoria. En otras palabras, hay tres suboperaciones que queremos realizar sin interrupción de otros subprocesos. Por ejemplo, colocándolo en el otro lado o haciendo que la operación de incremento sea atómica . Cuando anteponemos dos bloques de código con la palabra clave sincronizado , es importante tener en cuenta que también los marcamos como sincronizados para un objeto específico , como se muestra en nuestro ejemplo. Esto significa que si tenemos múltiples objetos Contador , diferentes subprocesos pueden actualizar esos contadores diferentes al mismo tiempo. Pero dos subprocesos no pueden ejecutar simultáneamente bloques sincronizados en la misma instancia de Counter .

2. Método sincronizado

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}
Si count es una instancia de SynchronizedCounter , la sincronización de estos métodos tiene dos efectos:
  • En primer lugar, dos llamadas a métodos sincronizados en el mismo objeto no pueden intercalarse. Cuando un subproceso ejecuta un método sincronizado en un objeto, todos los demás subprocesos que llaman a métodos sincronizados en el mismo bloque del objeto se detienen hasta que el primer subproceso termina de trabajar en el objeto.

  • En segundo lugar, cuando el método sincronizado sale, automáticamente establece el valor en "sucede antes" en cualquier llamada posterior al método sincronizado en el mismo objeto. Esto garantiza que los cambios en el estado del objeto sean visibles para todos los subprocesos.

Recuerde que saber por qué, cómo y cuándo usar sincronizados , así como otros modificadores, viene con la experiencia, y la experiencia viene con el tiempo.

Manejo de archivos en Java

Fuente: Usemynotes El contenido de esta publicación trata sobre el procesamiento de archivos en Java. Se familiarizará con las operaciones de procesamiento de archivos, los métodos de la clase Archivo y los tipos de secuencias. Pausa para el café #171.  Cómo utilizar la palabra clave sincronizada.  Procesamiento de archivos en Java - 2Trabajar con archivos es una parte integral de cualquier lenguaje de programación. Al utilizar archivos, un programa puede almacenar datos en un dispositivo de almacenamiento. Realizar diversas acciones en un archivo, como leer o escribir, requiere procesar el archivo. El procesamiento de archivos se define como leer de un archivo y escribir en un archivo. Para crear un objeto de archivo y manejar diferentes formatos de archivo, podemos usar la clase Archivo del paquete java.io. Si queremos utilizar la clase Archivo, necesitamos crear un objeto de la clase Archivo y especificar el nombre o la ruta del archivo. Con esta clase, podemos acceder a los metadatos del archivo, como el nombre del archivo, el tamaño del archivo, los permisos, el tipo de archivo, etc.
// importing all the classes of java.io
import java.io.*;
class FileHandle {
    public static void main(String[] arr) {
       // an object of File class is created.
       File f=new File("demo.txt");
}
}
Para importar la clase File , también puede usar import java.io.File en lugar de import java.io.* . Ahora aprendamos sobre los subprocesos, ya que Java los usa para realizar operaciones de entrada/salida (E/S) en un archivo.

¿Qué es un hilo en Java?

La secuencia es una secuencia de datos. También se puede definir como una secuencia de bytes. Se puede utilizar una secuencia para representar una fuente de entrada o un destino. El origen y el destino pueden ser archivos en disco, matrices, archivos de texto, etc. El flujo de entrada lee o recupera datos del origen y el flujo de salida escribe datos en el destino. Hay dos tipos de corrientes:

flujo de bytes

Un Byte Stream se utiliza para realizar operaciones de lectura y escritura en datos de bytes. El proceso de procesamiento de un archivo de flujo de bytes se define como realizar una entrada utilizando datos de bytes. Hay muchas clases relacionadas con flujos de bytes, pero las clases más utilizadas son FileInputStream y FileOutputStream .
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
   FileInputStream fin=new FileInputStream("source_file.txt");
   FileOutputStream fout=new FileOutputStream("destination_file.txt");
   int character;
   while((character=fin.read())!=-1)
   {
      System.out.print((char)character);
      // writing to destination file
      fout.write((char)character);
   }
   // closing source_file.txt
   fin.close();
   // closing destination_file.txt
   fout.close();
 }
}
En el ejemplo anterior, leemos datos del archivo de origen y los escribimos en el destino. -1 indica el final del archivo. Entonces, la lectura del archivo fuente se detendrá cuando aparezca -1.

Flujo de personajes

Character Stream se utiliza para realizar operaciones de lectura y escritura en datos de caracteres. El proceso de procesar un archivo con una secuencia de caracteres es el proceso de ejecutar datos de entrada con caracteres. Hay muchas clases de flujo de caracteres disponibles, pero las clases más utilizadas incluyen FileWriter y FileReader . Ahora analicemos algunos métodos de la clase Archivo .

Métodos de la clase Archivo en Java

puedo leer()

Este método de clase de archivo verifica si el archivo es legible y devuelve un valor booleano, es decir, verdadero o falso .

puede escribir()

Este es un método de clase de archivo que verifica si se puede escribir en un archivo y devuelve un valor booleano, es decir, verdadero o falso.

existe()

Este es un método de clase de archivo que se utiliza para verificar la existencia de un archivo determinado y devuelve un valor booleano.

crearNuevoArchivo()

Cuando queramos crear un nuevo archivo vacío, use este método de clase de archivo. Devuelve un valor booleano.

borrar()

Este es un método de clase de archivo que se utiliza para eliminar un archivo y devolver un valor booleano.

obtenerRutaAbsoluta()

Este método se utiliza para devolver la ruta absoluta de un archivo. getName() Este es un método utilizado para devolver un valor de cadena que es el nombre del archivo.

lista()

Devuelve una matriz de cadenas que representan todos los archivos del directorio.

longitud()

Este método de clase de archivo devuelve el tamaño del archivo en bytes.

mkdir()

Este es un método de clase de archivo que se utiliza para crear un nuevo directorio. Echemos un vistazo a las diversas operaciones de archivos disponibles en Java y cómo usarlas.

¿Qué son las operaciones de archivos en Java?

Al procesar archivos Java, podemos realizar las siguientes operaciones en un archivo:
  • Creando un archivo
  • Escribir datos en un archivo
  • Leer datos de un archivo
  • Eliminar un archivo
  • Obtener información sobre un archivo
  • Creando un archivo
En Java, podemos crear un archivo usando el método createNewFile() de la clase File . Este método devuelve verdadero si se crea el archivo; de lo contrario, devuelve falso si el archivo ya existe.
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
   // an object of file class
   File f=new File("demo.txt");
   // creating a new file
   Boolean result=f.createNewFile();
   if(result)
      System.out.print(f+" created successfully.");
   else
      System.out.format("%s","File cannot be created due to some error.");
 }
}

Escribir datos en un archivo

Una operación de escritura en un archivo significa almacenar datos en un archivo. Para realizar operaciones de escritura en un archivo, utilizamos el método write() junto con la clase FileWriter . Para cerrar una secuencia y obtener recursos asignados, debemos usar el método close() .
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     // creating a new file and writing data to a file
     FileWriter fw=new FileWriter("demo.txt");
     String s="Welcome, this is tutorial of Java File Handling.";
     fw.write(s);
     // closing a file
     fw.close();
   }
}

Leyendo de un archivo

Una operación de lectura significa acceder o recuperar datos almacenados en un archivo. Para realizar una operación de escritura en un archivo, usaremos la clase Scanner junto con los métodos hasNextLine() y nextLine() para recuperar datos del archivo. Para cerrar una secuencia, debemos usar el método close() .
import java.io.*;
import java.util.Scanner;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     File f=new File("demo.txt");
     Scanner sc=new Scanner(f);
     while(sc.hasNextLine())
     {
       String str=sc.nextLine();
       System.out.println(str);
     }
     // closing a file
     sc.close();
   }
}

Eliminar un archivo

Al procesar archivos Java, podemos eliminar un archivo usando el método eliminar () de la clase Archivo . No es necesario cerrar el archivo usando la función close() ya que las clases FileWriter y Scanner no se usan para eliminar el archivo .
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
      File f=new File("demo.txt");
      Boolean result=f.delete();
      if(result)
         System.out.print(f+" deleted successfully.");
      else
         System.out.format("%s","File cannot be deleted due to some error.");
   }
}

Obtener información sobre un archivo

Existen varios métodos en Java para obtener información sobre un archivo. Ya se han mencionado anteriormente en los métodos de la clase de archivo.
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     File file=new File("demo.txt");
     file.createNewFile();
     String filename=file.getName();
     System.out.println("File Name is "+filename);
     System.out.println("Absolute path of "+filename+" : "+file.getAbsolutePath());
     System.out.print("length of "+filename+" : "+file.length());
     System.out.println("Is "+filename+" readable? "+file.canRead());
     System.out.println("Is "+filename+" writable? "+file.canWrite());
     System.out.println("Is "+filename+" exists? "+file.exists());
  }
}
Veamos cómo funciona un programa Java para determinar si un número es par o impar utilizando una secuencia de matriz de bytes mientras procesa archivos Java. Para escribir este programa , usaremos la clase ByteArrayInputStream del paquete java.io. Esta clase contiene un búfer que se utiliza para leer una matriz de bytes como flujo de entrada. A continuación se muestra el código para comprobar si los números son pares o impares.
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     byte []buffer={10,40,81,23,32,100,57};
     ByteArrayInputStream by=new ByteArrayInputStream(buffer);

     int character=0;
     while((character=by.read())!=-1)
     {
        int number=character;
        if(number%2==0)
          System.out.println(number+" is an even number.");
        else
          System.out.println(number+" is an odd number.");
     }
   }
}
Espero que la información aquí presentada te haya resultado útil. Para comprender mejor cómo trabajar con archivos en Java, debe intentar implementar todos los métodos de operaciones y archivos usted mismo.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION