#SynchronizedLogs
Explore tagged Tumblr posts
sangeersoft · 6 hours ago
Text
youtube
Welcome to the official YouTube channel of RSoft Mobile App CRM. Here, we present the ultimate solution for seamless business management on your mobile device. Explore our upgraded features designed to enhance productivity and streamline workflows.
0 notes
justchelovek-blog · 6 years ago
Text
class Client extends Thread {    Account account;    public Client(Account acc) {        account = acc;    }    @Override    public void run() { //      synchronized (account) {            if (account.money - 70 > 0) { // достаточно ли средств ?                try {                    sleep((long) (1000 * Math.random()));  // имитируем задержку банкомата                } catch (InterruptedException e) {}                account.money -= 70;  // снимаем со счета нужную сумму                System.out.println(account.money);            }            else System.out.println("there are not enough funds on your account"); //      }    } }
Теперь имитируем одновременную попытку снятия денег:
public class SynchronizedLogic {    public static Account account;    class Account{        public double money;    }    public static void main(String[] args) {        account=new SynchronizedLogic().new Account();        account.money=100.;        Client client1=new Client(account);        Client client2=new Client(account);        client1.start();        client2.start();    } }
При выполнении этого примера на экран выведется:
30.0 -40.0
Что демонстрирует классический Data Races. Однако если раскомментировать конструкцию synchronized (account), которая принуждает потоки выполняться последовательно на участке проверки и уменьшения счета, то в этом случае вывод будет совершенно правильн��й с точки зрения логики работы банка:
30.0 there are not enough funds on your account
Применять блочную синхронизацию удобно, когда нужно синхронизировать не весь метод целиком. Например, вам нужно обеспечить чтение/изменение массива из разных потоков. Также если разработчик не имеет доступа к какому-либо методу, потому что не он его разработал. Тогда можно поместить вызов такого метода внутрь блока с синхронизацией.
0 notes