公元291年,惠帝司马衷的皇后贾南风和楚王司马玮合谋,杀掉了当时掌权的杨骏。杨骏是杨太后的哥哥,非常受武帝司马炎的信任,在武帝后期便主持了国家大事,和两个弟弟杨珧杨济一起,被称为“三杨”,惠帝继位后,杨骏以太尉的身份主理军国大事,大权独揽,司马氏皇族和皇后贾南风都非常反感,贾南风突然袭击,说杨骏谋反,把“三杨”和他们的全家抓起来杀掉,把杨太后关进冷宫饿死。任用汝南王司马亮和太保卫萁管理政事,又让杀杨骏有功的楚王司马玮管禁军,司马玮目中无人,横行霸道,听说卫萁要夺自己的兵权,便和贾南风合计,说汝南司马亮和卫萁合谋造反,杀了司马亮和卫萁,朝中权力全归贾南风掌握。
贾南风虽然是皇后,可她没有孩子,当时的太子不是自己生的,把太子先废掉后又杀死,赵王司马伦乘机和梁王司马肜发动兵变,把贾南风捉了起来,废掉了她的皇后位置。
赵王司马伦是个很有心计的人,他先前总是拍贾南风的马屁,取得了贾南风的信任,别人都认为他是贾氏的死党,实际上他是个野心很大的人,当贾南风废杀太子时,他默不作声,等太子被杀死,他突然起兵,废除贾后,自封为相国。在公元301年,又废除惠帝司马衷,自己当了皇帝。
司马伦废了惠帝,自己当皇帝,引起了分封在各地的王侯的极大不满,镇东大将军司马苶首先领兵举事,要讨伐司马伦,恢复晋惠帝的位置,他通知成都王司马颖,河间王司马颙一同起兵,司马伦也通知河间王司马颙(yóng)就地讨伐司马苶,司马颙见司马苶和司马颖的势力强大,便帮助司马苶而不帮司马伦。三个王侯的大兵打进京城,杀掉了司马伦和他的亲信孙秀,将惠帝司马衷接进都城,恢复了皇帝位。
司马苶恢复了司马衷的帝位,立了大功,在朝中掌管大权,而司马颙却没得到多少好处,便联合长沙王司马乂,发兵讨伐司马东,司马颙认为,司马乂的力量比不上司马苶,肯定会被司马苶打败,然后自己再打败司马苶,最后再废掉惠帝,换一个皇帝,自己来当宰相。哪知道如意算盘打得好,却落了个空,司马乂发兵成功,司马苶被杀,惠帝因为司马乂有功,任命司马乂为太尉,总管军政大事,掌握了实权。司马颙却一无所得,便再次联合成都王司马颖共同攻击司马乂,可是接连打了几仗,司马颖连连失败,司马颙准备退军算了,却突然传来好消息,东海王司马越和禁军将领朱默合谋,夜中捉住了司马乂,用火烧死。成都王司马颖被任为丞相,住在邺城,遥控朝政。司马颙被任为太宰,居住在长安。
公元304年,东海王司马越不满司马颖独掌大权,以皇帝的名义,发兵攻击司马颖,结果连败几次,只得逃回自己的封地去了,司马颖便把惠帝劫持到邺城,由自己控制起来。
当皇帝被劫持到邺城的时候,司马颙的大将张方乘虚占据了洛阳。不久,安北将军王浚和司马越的弟弟司马腾联合起来进攻司马颖,司马颖大败,带着晋惠帝司马衷一道逃到洛阳。洛阳守将张方又逼惠帝和司马颖迁居长安,接受司马颙的管辖,司马颙削掉了司马颖的官职,自己以太宰的身份主管全国军事。
公元305年,东海王司马越再次发兵进攻司马颙,这时候,司马颖的部下将军汲桑等人攻下了邺城,将司马颖接回邺城。司马颙抵不住许多诸侯的进攻,丢下晋惠帝独自逃跑,晋惠帝这才被司马越再一次接回洛阳,仍然当他的皇帝。惠帝任司马越为太傅,总管大权。司马越派人找到司马颙,请他回朝,让他当司空,司马颙信以为真,在回洛阳的途中不明不白地被人杀死。
司马越掌权以后,不满意司马衷,便将司马衷毒死,然后立司马炎的第二十五个儿子司马炽为皇帝,这就是晋怀帝,到这时候,“八王之乱”宣告结束。
所谓“八王之乱”,指的就是从公元303年到305年这一段时间内,诸侯王互相攻杀的事件,这八个王是:汝南王司马亮、楚王司马玮、齐王司马苶、赵王司马伦、长沙王司马乂,河间王司马颙,东海王司马越、成都王司马颖。实际上,参加“八王之乱”的诸侯王不止八个,《晋书》将这八个人合为一篇传记,统称八王,后代将这一事件通称为“八王之乱”。