Почему синхронизация потока
Потому что, когда у нас есть несколько потоков для доступа к переменной или объекту одновременно, если в этих потоках есть как операции чтения, так и записи, это приведет к путанице в значении переменной или статусе объекта, что приведет к исключениям программы. Например, если банковский счет эксплуатируется двумя потоками одновременно, один снимает 100 юаней, а другой экономит 100 юаней. Предполагая, что у аккаунта первоначально было 0 юаней, что произойдет, если бы нить снятия и сберегательный поток произошел одновременно? Если вывод денег не является успешным, баланс счета составляет 100. Если вывод денег является успешным, баланс счета равен 0. Итак, какой это? Трудно объяснить четко. Следовательно, многопоточная синхронизация предназначена для решения этой проблемы.
1. Код, когда вы не синхронизировано
Bank.java Пакет Threadtest; out .println (System.currentTimeMillis ()+"Save:"+Money); ::::::::::::::::: ::::::::::::::::: :::::::::::: «Взять:"+Money); (String args []) {final Bank Bank = new B ank (); {Thread.slee (1000); /n ");}}}); thread tsub = new Thread (new Runnable () {@Override public void run () {// todo автоматически сгенерированный метод while (true) {bank.submoney (100); банк .lookmoney (); });
Код очень прост, я не объясню. Я перехватил некоторые из них, это очень грязно, и я не могу понять написание.
Недостаточный баланс баланса счета: 0
Недостаточный баланс баланса счета: 100
1441790503354 Депозит: 100
Баланс счета: 100
1441790504354 Депозит: 100
Баланс счета: 100
1441790504354 ВЫСОТ: 100
Баланс счета: 100
1441790505355 Депозит: 100
Баланс счета: 100
1441790505355 ВЫСОТ: 100
Баланс счета: 100
2. Используйте синхронный код
(1) Метод синхронизации:
Существует метод изменения синхронизированных ключевых слов. Поскольку каждый объект в Java имеет встроенную блокировку, при изменении метода с помощью этого ключевого слова встроенная блокировка защищает весь метод. Прежде чем вызывать этот метод, вам необходимо получить встроенный замок, в противном случае он будет в состоянии блокировки.
Модифицированный Bank.java
Давайте посмотрим на результаты бега:
Недостаточный баланс баланса счета: 0
Недостаточный баланс баланса счета: 0
1441790837380saved: 100
Баланс счета: 100
1441790838380 ВЫСОТ: 100
Баланс счета: 0
1441790838380saved: 100
Баланс счета: 100
1441790839381取出:100
账户余额:0
Я чувствую, что это понимает мгновенно.
Примечание. Синхронизированное ключевое слово также может изменить статические методы.
(2) Синхронизировать кодовые блоки
То есть существует блок оператора, измененный с помощью синхронизированного ключевого слова. Блок операторов, измененный этим ключевым словом, будет автоматически добавлен со встроенной блокировкой для достижения синхронизации
Bank.java Code выглядит следующим образом:
Пакет ThreadTest; System.out.println (System.CurrentTimeMillis ()+"Save:"+Money); .println ("Недостаток баланса"); {System.out.println ("Баланс учетной записи:"+count);
Результаты работы следующие:
Недостаточный баланс баланса счета: 0
1441791806699saved: 100
Баланс счета: 100
1441791806700 ВЫСОТ: 100
Баланс счета: 0
1441791807699saved: 100
Баланс счета: 100
Эффект аналогичен методу.
ПРИМЕЧАНИЕ. Синхронизация-это высокопоставленная операция, поэтому синхронизированный контент должен быть сведен к минимуму. Обычно нет необходимости синхронизировать весь метод, просто используйте синхронизированный кодовый блок, чтобы синхронизировать код ключа.
(3) Используйте специальные доменные переменные (нестабильные) для достижения синхронизации потока
A.volatile Keyword предоставляет механизм без блокировки для доступа к переменным доменам
b.
c.
D. Volatile не предоставляет никаких атомных операций, и не может использоваться для изменения переменных конечного типа
Bank.java Code выглядит следующим образом:
Пакет ThreadTest; (System.CurrentTimeMillis () + "Save:" + Money); ; " + count);}}
Как эффект работы?
Недостаточный баланс баланса счета: 0
Недостаточный баланс баланса счета: 100
1441792010959存进:100
Баланс счета: 100
1441792011960 ВЫСОТ: 100
Баланс счета: 0
1441792011961saved: 100
Баланс счета: 100
Это потому, что я не могу понять это снова, и это снова грязно? Почему это? Это потому, что летучие не могут гарантировать атомные операции, поэтому летучие не может заменить синхронизированный. Кроме того, волатильный будет организовать компилятор для оптимизации кода, поэтому, если вы можете его использовать, он не будет применяться. Его принцип состоит в том, что каждый раз, когда поток хочет получить доступ к переменной, измененной летучими, он считывается из памяти, а не в кэше, поэтому значение переменной, доступ к которому, доступное каждому потоку, одинаково.这样就保证了同步。
(4)使用重入锁实现线程同步
在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。 Класс Reentrantlock - это повторный, взаимоисключающий блокировка, которая реализует интерфейс блокировки.
ReenreantLock类的常用方法有:
ReentrantLock() : 创建一个ReentrantLock实例
lock (): получить блокировку
unlock (): reentrantlock Примечание: reentrantlock () также имеет конструктор, который может создавать честные замки, но не рекомендуется использовать его, поскольку он может значительно снизить эффективность работы программы.
Код Bank.java изменен следующим образом:
Пакет Threadtest; //Вам нужно объявить этот блокировка частной блокировки = new Reentrantlock (); TLN (System .currentTimeMillis () + "Save:" + Money); if (Count - Money <0) {System.out.println ("Недостаточный баланс"); ;
Как эффект работы?
Недостаточный баланс баланса счета: 0
Недостаточный баланс баланса счета: 0
1441792891934 Депозит: 100
Баланс счета: 100
1441792892935saved: 100
Баланс счета: 200
1441792892954 ВЫСОТ: 100
Баланс счета: 100
Эффект похож на первые два метода.
Если синхронизированное ключевое слово может удовлетворить потребности пользователей, используйте синхронизированный, потому что оно может упростить код. Если вам нужны более продвинутые функции, используйте класс Reentrantlock.
(5) Используйте локальные переменные для достижения синхронизации потока
Bank.java Code выглядит следующим образом:
Пакет ThreadTest; возврат 0; ); ()- деньги); Считается get ();
Эффект бега:
Недостаточный баланс баланса счета: 0
Недостаточный баланс баланса счета: 0
1441794247939saved: 100
Баланс счета: 100
Недостаточный баланс
1441794248940Save: 100
Баланс счета: 0
Баланс счета: 200
Недостаточный баланс баланса счета: 0
1441794249941saved: 100
Баланс счета: 300
Увидев эффект операции, я был запутан в начале. Взгляните на принцип Threadlocal:
Если вы используете Threadlocal для управления переменными, каждый поток, использующий переменную, получит копию переменной, а копии не зависят друг от друга, чтобы каждый поток мог изменить свою собственную копию переменной по желанию, не влияя на другие потоки. Теперь я понимаю.所以就会发生上面的效果。
Механизм нитока и синхронизации
A. Механизмы Sthreadlocal and Synchronization предназначены для решения проблемы конфликта доступа к одной и той же переменной в многопоточных числах
б.
Теперь я понимаю. Каждый имеет свои собственные преимущества и недостатки и имеет свои применимые сценарии.