1. La palabra clave sincronizada
1. Modifiquemos el método de retiro en la última serialización
// añadir la palabra clave sincronizada puede ser de hasta miembros de los métodos para lograr el propósito de la sincronización de la variables de memoria pública sincronizado sin efecto la retirada ( Doble dinero) { Doble la vez = la presente .balance - Dinero; el try { // aquí deliberadamente retrasó un poco, se puede ver el balance mal el Thread.sleep ( 1000 ); } la captura (InterruptedException E) { } la presente .setBalance (Después); }
Estos dos métodos tienen un rango de control de palabras clave más grande, y más y más códigos en el futuro pueden reducir la eficiencia, que no es tan eficiente como los bloques de código que se sincronizan con precisión.
Ejemplos de clases seguras para subprocesos: StringBuffer \ Vector \ HashTable
Déjame explicarte un caso
empaquetar com.bjpowernode.java_learning; pública clase D109_1_SynchronizedMechanism { públicas estáticas void main (String [] args) lanza InterruptedException { MyClass109 mc = nueva MyClass109 (); Procesador109 p = nuevo Procesador109 (mc); Hilo t1 = nuevo Hilo (p); Hilo t2 = nuevo Hilo (p); t1.setName ( "t1" ); t2.setName ( "t2" ); t1.start (); // 延迟 (保证 t1 线程 先 启动 , 并 执行 ejecutar) Thread.sleep ( 1000 ); t2.start (); } } Clase Processer109 implementos Runnable { MyClass109 mc; pública Processer109 (MyClass109 mc) { este .mc = mc; } public void run () { if (Thread.currentThread (). getName (). equals ("t1" )) { mc.m1 (); } if (Thread.currentThread (). getName (). equals ("t2" )) { mc.m2 (); } } } clase MyClass109 { vacío público sincronizado m1 () { // sleep try { Thread.sleep ( 1500 ); System.out.println ( "m1 ....." ); } catch (Exception w) { } } // el método m2 esperará a que termine el método m1 , Debido a que t1 y t2 comparten un mc, y esta palabra clave en los métodos m1 y m2, comparte un objeto mc public sincronizado vacío m2 () { System.out.println ( "m2 ......" ); } // // la ejecución del método m2 no necesita esperar a que m1 termine, porque el método m2 no está sincronizado // public void m2 () { // System.out.println ("m2 ......"); // } }
Segundo, el uso de anotaciones del sistema.
Paquete com.bjpowernode.java_learning; Importación java.util.LinkedList; pública clase D109_2_SuperClass { públicas estáticas void main (String [] args) { SuperClass109 superObj = nueva nueva SuperClass109 (); superObj.MethodA (); // acceder obsoletos El método, IDE agregará un tachado System.out.println (superObj.var); // Acceder al dominio obsoleto, también agregará un tachado SubClass109 subObj = new SubClass109 (); subObj.MethodB1 (); // - ------------ // La siguiente anotación se utiliza para suprimir el mensaje de advertencia de compilación de la siguiente declaración @SuppressWarnings ("rawtypes" ) LinkedList list = new LinkedList (); // Las siguientes dos declaraciones no agregan @SuppressWarnings, aparecerá un mensaje de advertencia durante la compilación list.add ( 123 ); list.add ( "Beijing" ); for ( int i = 0; I <2; I ++ ) { System.out.println (List.get (I)); } } } clase SuperClass109 { // para anotar var, var representa anticuado, aunque var anticuado, pero puede todavía Utilice @Deprecated int var = 125 ; @Deprecated public void MethodA () { System.out.println ("Método Method () en la clase padre!" ); } Public void MethodB () { System.out.println ( "Método MethodB en la clase padre!" ); } } Class SubClass109 extiende SuperClass109 { // @Override public void MethodB1 () { System.out.println ( "método MethodB subclases sustituir la clase padre ()!" ); } }
3. Anotaciones personalizadas
1. Las anotaciones personalizadas deben declararse utilizando @interface, que heredará automáticamente la interfaz java.lang.annotation.Annotation
2. Al definir anotaciones personalizadas, no puede heredar otras anotaciones e interfaces. @Interface solo se usa para declarar una anotación. Cada método en la anotación es en realidad un parámetro de configuración.
3. El nombre del método es el nombre del parámetro, y el tipo de retorno es el tipo del parámetro. El tipo del valor de retorno solo puede ser el tipo de datos básico, Clase, Cadena, Enum. El valor predeterminado del parámetro se puede declarar mediante la palabra clave predeterminada.
4. Formato gramatical
[ public | final ] @ nombre de anotación de interfaz { elemento de anotación }
Entre ellos, la palabra clave @Interface significa declarar una anotación personalizada, "nombre de anotación" es un identificador legal, "elemento de anotación" es un método sin parámetros, el tipo de método es el tipo de elemento de anotación.
Formato de sintaxis del elemento de anotación
Nombre del elemento de anotación de tipo de datos () [ predeterminado ]
Si solo hay un elemento de anotación, en el caso de que el elemento de anotación se denomine valor, no es necesario escribir el nombre del elemento de anotación cuando se usa, solo necesita dar directamente el valor de anotación. Cuando use anotaciones personalizadas, libere las anotaciones personalizadas en la línea anterior o la misma línea que requiere las anotaciones, y escriba el valor del elemento de anotación entre paréntesis después de las anotaciones personalizadas. Si usa el valor predeterminado, no puede dar el soporte de papel. Si solo hay un elemento de anotación y el valor se nombra, solo necesita dar el valor en lugar de dar el nombre del elemento de anotación.
Cuarto, el código fuente:
D109_1_SynchronizedMechanism.java
D109_2_SuperClass.java
https://github.com/ruigege66/Java/blob/master/D109_1_SynchronizedMechanism.java
https://github.com/ruigege66/Java/blob/master/D109_2_SuperClass.java
2.CSDN : https: //blog.csdn.net/weixin_44630050
3. Blog Park: https://www.cnblogs.com/ruigege0000/
4. Bienvenido a prestar atención al número público de WeChat: transformación de Fourier, número público personal, solo utilizado para el aprendizaje y la comunicación, responder "paquete de regalo" en segundo plano, obtener materiales de aprendizaje de big data