主人公ウォン・フェイフォン（黄飛鴻）は当時実在した中国武術の大家であり、彼を主人公にした映画は数知れず制作されている。なお本作の監督であるラウ・カーリョンは、実在のフェイフォンの弟子の孫であり、数多くの映画などで過大に装飾されていったフェイフォンについて、実在の当人の伝承を最も正確に伝える人物の一人である。「力なき市民を虐待する権力の横暴に立ち向かうヒーロー」を描いた正統派カンフー映画を志向するラウ・カーリョンが監督になったことで、列強進出が激しくなった物語の時代背景を反映したレジスタンス活劇映画として作られ、英国人とその配下の粗暴な武芸者たちによる市民虐待描写を過酷に描くなど、明るく楽しい活劇に仕上がった前作とは異なりコメディ要素が薄まり、かなり重々しいアクション映画となった。
列強進出が著しい清朝末期の広東。酔八仙（酔拳）を会得したものの、酒の勢いで暴走してしまうフェイフォン（ジャッキー・チェン）は、父ケイイン（ティ・ロン）から酔拳の使用を禁じられていた。一方、イギリスが領事館を通じて中国の国宝を国外へ密輸していた事実を察知した武術家マンケイ（ラウ・カーリョン）は阻止に動く。ひょんなことからマンケイと知り合い事情を知ったフェイフォンだったが、やがて英国の魔手が彼とその仲間に及ぼうとしていた。
ジャッキーが1978年に主演して世界中でヒットとなった『ドランクモンキー 酔拳』の続編。ただし「2」を名乗っているものの、設定や登場人物については前作を継承しておらず、酔八仙（拳）と父親と「歴代の先祖達が眠っている土地が鍵」といった設定以外は前作と脈絡が繋がっていない単独の作品となっている。監督のラウ・カーリョンが撮影途中で降板したため、ほとんどのシーンはジャッキー監督で撮影された。降板理由について当時のインタビュー記事によると「カーリョンが撮影したアクションは相当に古風で、現在のジャッキー作品としてはあまりに古臭く、ラッシュを見たジャッキーとスタントチームが、このままでは興行に影響が出ると判断してカーリョンの解雇やむなしとの結論に至り、その後、カーリョンが撮影したアクションのうち半分弱をジャッキー自身が監督して撮り直すことになった」とある。なおジャッキーは自伝において「意見の相違があったが現在も友情は変わらない」と述懐している。本作で継母のリンが非常に強いのは、同時期に制作されたジェット・リーの『格闘飛龍 方世玉』の影響が大きいと言われている。ラストの泡を吹くシーンの撮影で、ある薬品を使ったため、ジャッキーは翌日喉をやられてしまった。
2015年に山口でダブルボランチとしてペアを組んだ庄司悦大からは「相手の逆を突くのがうまいし、それでいて味方へのパスは受けやすいところに出す」とパサーとしての技術の高さを評価する一方で「プレーにちょっと波がある。その波さえなくなれば、相当なレベルの選手になるだろう」とも指摘している。一方で、ヘディングは得意ではなく、川口尚紀とのインタビューで川口のクロスから決めたいと話した際に川口に「ないじゃん」と冗談混じりに返されていた。しかし、その後2019年の第10節・サガン鳥栖戦にてヘディングでJ1初得点を記録している。
以下のPOSIXスレッドライブラリを使ったC言語コードでは、複数のスレッドがグローバル変数によるフラグを共有している。1番目のスレッドはビジーウェイトでフラグの値の変化を待っている。#include <stdio.h>#include <pthread.h>#include <unistd.h>/* 全関数から見えるグローバルフラグ変数 */volatile int g_flag;/* スレッド#1はフラグが偽 (0) になることをスピンして待つ */static void *thread_func1(void*) {    while (g_flag) {        /* 何もしない - 単にチェックしながら回り続ける */    }     printf("Thread#1 received notification: value of flag has been changed to %d.\n", g_flag);    return NULL;}/* スレッド#2は一定時間待機した後にフラグを偽 (0) にする */static void *thread_func2(void*) {    sleep(60); /* 60秒間スリープ */    g_flag = 0;    printf("Thread#2 changed the value of flag to %d.\n", g_flag);    return NULL;}int main(void) {    int ret_code;    pthread_t t1, t2;    g_flag = 1; /* フラグを真にする */    ret_code = pthread_create(&t1, NULL, thread_func1, NULL);    if (ret_code != 0) {        printf("Failed to create pthread #1.\n");        return -1;    }    ret_code = pthread_create(&t2, NULL, thread_func2, NULL);    if (ret_code != 0) {        printf("Failed to create pthread #2.\n");        return -1;    }    pthread_join(t1, NULL);    pthread_join(t2, NULL);    printf("All pthreads finished.\n");    return 0;}なお、C言語およびC++におけるvolatileキーワードはコンパイラ最適化を抑止するための修飾子であり、効果は処理系に依存する。C/C++の規格でスレッドが標準化されていなかった時代では、スレッド間で共有するフラグ変数にvolatileを指定することで、レジスタキャッシュではなく必ずメモリから値を読み出すように最適化を抑止する効果が期待されることから慣習的に使われていたが、本来はスレッドの同期目的で使ってはならない。フラグ変数の操作をミューテックス (mutex) によるクリティカルセクションで保護して明示的に同期したり、条件変数 (condition variable) を使ったり、C11やC++11規格以降のアトミック変数を使ったりするべきである。一方、JavaあるいはC#のような後発のプログラミング言語では、最初からスレッドが標準化されて言語仕様に組み込まれており、限定された範囲でvolatileキーワードを軽量な同期プリミティブの実装に利用することが可能である。UNIX系システムでは、次のように上記コードをコンパイルすることができる:$ cc spinlock.c -lpthread