RLOCK(A)の研究スレッドロック

デッドロックは:実装プロセス内の2つの以上のプロセスまたはスレッドの現象を指し、お互いを待っによって引き起こされるリソースの競合の結果は、外力のない状態で、彼らはそれを促進することができません。この時点で、システムはデッドロックと呼ばれる別のプロセスを待っているの過程で常にデッドロックを生成するために、デッドロック状態またはシステムであると言います
 

 RLock lock = redissonClient.getLock(lockKey);

        lock.lock(2, TimeUnit.SECONDS);

        try {
            RDeque<String> deque = redissonClient.getDeque(userKey);

            // 如果队列里没有此token,且用户没有被踢出;放入队列
            if (!deque.contains(token) && currentSession.isKickout() == false) {
                deque.push(token);
            }

            // 如果队列里的sessionId数超出最大会话数,开始踢人
            while (deque.size() > maxSession) {
                String kickoutSessionId;
                if (kickoutAfter) { // 如果踢出后者
                    kickoutSessionId = deque.removeFirst();
                } else { // 否则踢出前者
                    kickoutSessionId = deque.removeLast();
                }

                try {
                    RBucket<UserBO> bucket = redissonClient.getBucket(kickoutSessionId);
                    UserBO kickoutSession = bucket.get();

                    if (kickoutSession != null) {
                        // 设置会话的kickout属性表示踢出了
                        kickoutSession.setKickout(true);
                        bucket.set(kickoutSession);
                    }

                } catch (Exception e) {
                }

            }

            // 如果被踢出了,直接退出,重定向到踢出后的地址
            if (currentSession.isKickout()) {
                // 会话被踢出了
                try {
                    // 注销
                    userService.logout(token);
                    sendJsonResponse(response, 4001, "您的账号已在其他设备登录");

                } catch (Exception e) {
                }

                return false;

            }

        } finally {
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
                LOGGER.info(Thread.currentThread().getName() + " unlock");

            } else {
                LOGGER.info(Thread.currentThread().getName() + " already automatically release lock");
            }
        }

それでは、どのようにデッドロック現象を解決するには?

ソリューション、再帰的なロック:Pythonのをサポートするために、同じスレッド内の同じリソースに対する複数の要求、PythonはリエントラントロックRLOCKを提供します。この内部RLOCKはロックとカウンタ変数を維持したリソースは多くの時間が必要になることができるように、カウンタは、回獲得数を記録します。すべてがリリースされるまで、リソースを取得するために他のスレッドをスレッドを取得します。もし代わりにRLOCKロックを使用して上記の例では、デッドロックが発生しません。

threading.Lockとthreading.RLock差:同じスレッドで複数回取得させることRLOCK。ロックはこれを許可していません。注:RLOCKを使用する場合は、取得しリリースがペアになっている必要があり、それが呼び出さn回が取得され、あなたはn番目のリリースが実際に占有ささいを解放することができます呼び出す必要があります。

基本コンセプト

分散

異なるサーバー上に配備されたシステムにおける複数のモジュールは、Tomcatなど、分散システムと呼ばれることができ、データベースが別のサーバーにデプロイされている別のサーバー、またはその両方のTomcat同じ機能に展開されています

ハイアベイラビリティ

システム内のいくつかのノードに障害が発生すると、他のノードは、高可用性システムを持っていると考えることができ、サービスを提供し続ける引き継ぐことができます

クラスタ

展開の全体として特定の分野のソフトウェアは、複数のサーバ上のサービスのクラスを提供し、クラスタ全体と呼ばれます。マスターとスレーブとして飼育係は全体の中央集中型のコンフィギュレーション・サービスを提供を形成するために一緒に複数のサーバーに展開されています。

典型的なクラスタでは、クライアントは、多くの場合、サービスへの任意のノードへのアクセスを接続することができ、およびクラスタノードをドロップしたとき、他のノードは、多くの場合、自動的に高可用性クラスタの説明で、この時間を引き継ぐサービスを提供し続けることができます

ロードバランシング

要求がシステムに送信されると、要求によって何らかの方法で複数のノードに均等に分配され、システムの各ノードは、一様に処理要求負荷とすることができる負荷分散システムと考えることができます

フォワードプロキシとリバースプロキシ

プロキシサーバによって統一外部ネットワークにアクセスするための内部システムは、アウト要求を転送するとき、それはプロキシサーバが外部ネットワークへのアクセスに開始されているようですし、プロキシサーバの実装は、フォワードプロキシであり、外部からの要求がシステムに入るとき、プロキシサーバー要求が外部要求に、サーバ・システムに転送され、プロキシサーバは、プロキシサーバがリバースプロキシを実装されている、唯一の相互作用します。

簡潔には、フォワードプロキシは、外部のネットワークにアクセスする代わりに、内部システム・プロシージャのプロキシサーバであり、リバースプロキシは、内部サーバプロセスに外部プロキシ・サーバを介してシステムにアクセスするための要求を転送します。

おすすめ

転載: blog.csdn.net/qq_37996327/article/details/92804522