Синхронизация потока Java в основном в соответствии с логикой: добавить блокировку -------> Modify ---------> Lock Lock
1. Синхронизируйте кодовые блоки
Примеры следующие:
открытый класс syncblock {static class datawrap {int i; } static class syncblockthread extends thread {private dataWrap date; public syncblockthread (datawrap datawrap) {this.date = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {synchronized (date) {date.i ++; попробуйте {Sleep (1); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println (getName () + "" + date.i); }}}} public static void main (string [] args) {// переменная реализации многопотоковой. new Syncblockthread (dataWrap) .start (); new Syncblockthread (dataWrap) .start (); new Syncblockthread (dataWrap) .start (); }}В примере вы хотите вывести целые числа в последовательности.
Обычно синхронные кодовые блоки - это объекты, которые необходимо заблокировать, и, как правило, являются общими ресурсами, которые требуют одновременного доступа. Любой поток сначала блокирует ресурс перед изменением указанного ресурса. В течение периода блокировки другие потоки не могут изменить ресурс. Это обеспечивает безопасность потоков. Кроме того, поток не отказатся от блокировки ресурсов при вызове сна или урожая.
2. Метод синхронизации
открытый класс SyncMethod {Static Class DataWrap {int i; public synchrinized void valuegrow () {i ++; try {thread.sleep (1); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } System.out.println (think.currentThread (). GetName () + "" + i); }} статический класс syncmethodthread extends thread {dataWrap dataWrap; public syncmethodthread (datawrap datawrap) {this.datawrap = datawrap; } @Override public void run () {for (int i = 0; i <10; i ++) {dataWrap.valuegrow (); }}} public static void main (string [] args) {// реализовать последовательный рост и вывод I DataWrap dataWrap = new DataWrap (); new Syncmethodthread (dataWrap) .start (); new Syncmethodthread (dataWrap) .start (); new Syncmethodthread (dataWrap) .start (); }}Метод синхронизации - это метод, измененный с помощью синхронизированного ключевого слова. Метод синхронизации блокирует сам объект. Следовательно, когда поток вызывает метод синхронизации определенного объекта, если другие потоки вызывают другие методы синхронизации объекта, им все равно приходится подождать, чтобы освободить блокировку объекта, потому что объект был заблокирован.
3. Синхронная блокировка
Синхронизация достигается путем определения объекта блокировки синхронизации, и в этом случае блокировка синхронизации использует объект блокировки, чтобы действовать как.
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class synclock {static class datawrap {lock lock = new Reentrantlock (); int i; public void valuegrow () {lock.lock (); попробуйте {i ++; try {thread.sleep (1); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } System.out.println (think.currentThread (). GetName () + "" + i); } наконец {lock.unlock (); }}} static class synclockthread extends thread {dataWrap dataWrap; public synclockthread (datawrap datawrap) {this.datawrap = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {dataWrap.valuegrow (); }}} public static void main (string [] args) {// реализовать последовательный рост и вывод I DataWrap dataWrap = new DataWrap (); new Synclockthread (dataWrap) .start (); new Synclockthread (dataWrap) .start (); new Synclockthread (dataWrap) .start (); }}Использование объектов блокировки для реализации синхронизации потоков будет более гибким. Некоторые блокировки также имеют некоторые конкретные функции, среди которых более часто используемые чтения чтения и записи readwritelock, а Reentrantlock может вернуться в блокировку.