Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) [Parte I]
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Threads y Sincronización

El JNDI define acceso síncrono a los sistemas de nombres y directorios. La igual que la mayoría de los APIS definidos para la plataforma Java, el acceso asíncrono se consigue usando varios threads.

Cuando usamos varios threads en nuestro programa, debemos recordar que el JNDI especifica que en los accesos concurrentes al mismo ejemplar Context no está garantizado que sean seguros ante los threads. Aunque algunos proveedores de servicios podrían garantizar la seguridad ante los threads para el mismo ejemplar de Context, es mejor usar sincronización para que el código sea portable a diferentes implementaciones de proveedores de servicios. Cuando usamos varios threads para acceder a diferentes ejemplares de Context, no necesitan estár sincronizados.

Aquí tenemos un ejemplo que crea dos threads, cada uno lista un ejemplar distinto de Context:

// Create the contexts
Context ctx1 = new InitialContext(env);
Context ctx2 = (Context)ctx1.lookup("ou=People");

// Create the threads
Thread thread1 = new ListThread(ctx1, "ONE");
Thread thread2 = new ListThread(ctx2, "TWO");

// Let them work
thread1.start();
thread2.start();

El método run() de cada threads e parece a esto.

public void run() {
    try {
	NamingEnumeration enum = ctx.list("");
	while (enum.hasMore()) {
	    System.out.println(label + ": " + enum.next());
	}
    } catch (NamingException e) {
	System.out.println(label + ": " + e);
    }
}

Cuando ejecutemos este programa, veremos la siguiente salida.

# java DiffCtx
ONE: ou=Groups: javax.naming.directory.DirContext
ONE: ou=People: javax.naming.directory.DirContext
ONE: ou=Staff: javax.naming.directory.DirContext
ONE: ou=NewHires: javax.naming.directory.DirContext
TWO: cn=Ted Geisel: javax.naming.directory.DirContext
ONE: cn=favDrink: javax.naming.directory.DirContext
TWO: cn=Jon Ruiz: javax.naming.directory.DirContext
TWO: cn=Scott Seligman: javax.naming.directory.DirContext
...

Observa qua a pesar del echo de que ambos ejemplares de Context están derivados del mismo ejemplar InitialContext, no necesitamos bloquear sus accesos. Sin embargo, si modificamos ligeramente el ejemplo para poder usar dos threads que listen el mismo Context, necesitamos bloquear el ejemplar de Context. En el siguiente programa modificado, el método run() del thread se parecería a esto.

public void run() {
    try {
	// Lock for multithreaded access
	synchronized (ctx) {
	    NamingEnumeration enum = ctx.list("");
	    while (enum.hasMore()) {
		System.out.println(label + ": " + enum.next());
	    }
	}
    } catch (NamingException e) {
	System.out.println(label + ": " + e);
    }
}

Cuando ejecutemos este ejmplo, generará la siguiente salida.

# java SameCtx
ONE: ou=Groups: javax.naming.directory.DirContext
ONE: ou=People: javax.naming.directory.DirContext
ONE: ou=Staff: javax.naming.directory.DirContext
ONE: ou=NewHires: javax.naming.directory.DirContext
ONE: cn=favDrink: javax.naming.directory.DirContext
TWO: ou=Groups: javax.naming.directory.DirContext
TWO: ou=People: javax.naming.directory.DirContext
TWO: ou=Staff: javax.naming.directory.DirContext
TWO: ou=NewHires: javax.naming.directory.DirContext
TWO: cn=favDrink: javax.naming.directory.DirContext

Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis