Когда ключевое слово Java Language используется для изменения метода или кодового блока, оно может убедиться, что в максимум максимум один поток выполняет код одновременно.
1. Используйте его при объявлении метода после оператора применения (публика и т. Д.), До объявления типа возврата (void и т. Д.). Введите метод за раз и другие потоки, если вы хотите назвать этот метод в настоящее время, вы можете ждать только в очереди. может войти.
Например:
Общедоступный синхронизированный void synmethod () {// метод кузов}2. Используйте синхронизированные следование, а в таком случае включены переменные.
public int synmethod (int a1) {synchronized (a1) {// только один поток может входить за раз}} 3. Существует объект в скобках после синхронизации.
Общедоступный класс Mythread реализует {public static void main (string args []) {mythread mt = new mythread (); ); t6 "); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); t6.start ();} public void run () {синхронизированный (это ) {System.out.println (Thread.currentThread (). GetName ());Для 3, если поток входит, он получает текущую блокировку объекта, а тогда любые операции других потоков на всех объектах в классе не могут быть выполнены. Зачем блокировать весь объект, не позволяя другим потокам кратко использовать другие методы синхронизации в объекте для доступа к общим ресурсам? Если у объекта есть несколько ресурсов, ему не нужно блокировать все потоки снаружи, просто чтобы поток использовал некоторые ресурсы. Поскольку у каждого объекта есть блокировка, вы можете использовать виртуальный объект, чтобы заблокировать его следующим образом:
Класс Finegrainlock {mymemberclass x, y; Используйте общие ресурсы Synchronized (ylock) {// access y здесь}} public void bar () {synchronized (this) {// Доступ к x и y здесь} // Сделать здесь - но не используйте общие ресурсы} }4. Класс находится в скобках после синхронизации.
Класс ArrayWithlockord {Private Long Num_locks = 0; / Добавить 1 к номеру блокировки. lock_order = num_locks; }} public long lockorder () {return lock_order; ; int size = a1.array (). Length; // заказ. First = A2; синхронизированный (последний) {int [] arr1 = a1.array (); i];Для 4, если поток входит, все операции в потоке не могут быть выполнены в классе, включая статические переменные и статические методы.
PS: синхронизированное резюме использования
Синхронизированный использует разные места, чтобы повлиять на код:
1. Синхронизированный метод изменения ключевых слов
Предполагая, что P1 и P2 являются разными объектами одного и того же класса, этот класс определяет блок синхронизации или метод синхронизации в следующих ситуациях, и P1 и P2 могут их вызывать.
Public Synchronized void Method () {//}Это метод синхронизации. То есть, когда объект P1 выполняет этот метод синхронизации в разных потоках, они будут формировать взаимное исключение для достижения влияния синхронизации. В то же время, если в объекте есть несколько методов синхронизации, когда поток выполняет синхронизированный метод в объекте, другие методы синхронизации в объекте не позволяют выполнять другие потоки. Однако другой объект P2, сгенерированный классом, к которому принадлежит этот объект, может произвольно вызвать этот метод с добавлением синхронизированного ключевого слова.
Приведенный выше пример код эквивалентен следующему коду:
public void method () {synchronized (this) {// ..}}На этот раз это блокировка объекта P1. .
2 Синхронизировать блоки, пример кода заключается в следующем:
public void method () {synchronized (this) {// ..}}В настоящее время блокировка - это объект SO, и каждый объект соответствует уникальной блокировке, поэтому тот, кто поток получает этот блокировка объекта, сможет запустить код, который он управляет. Когда есть четкий объект в качестве блокировки, вы можете написать программу, как эта, но когда нет четкого объекта в качестве блокировки, вы просто хотите синхронизировать кусок кода, вы можете создать переменную специального экземпляра (это должно быть объект) действовать как замк:
Приватный байт [] lock = new Byte [0];
ПРИМЕЧАНИЕ. Объекты байтов с нулевой длиной более экономичны, чем любой объект для создания.
3 Используйте синхронизированный с статической функцией, пример кода заключается в следующем:
Класс foo {public static void method1 () {//. Оба синхронных метода вызывают блокировку класса класса, к которому принадлежит объект этого метода (класс, больше не конкретный объект, сгенерированный этим классом).
Можно сделать вывод, что если класс определяет синхронизированную статическую функцию A, а также определяет функцию синхронизированного экземпляра B, то один и тот же объект OBJ этого класса не будет представлять собой метод A и B соответственно при доступе к двум методам A и B в нескольких потоках . Замок метода A - это класс, к которому принадлежит OBJ, а замок B является объектом, к которому принадлежит OBJ.