线程同步有哪几种方式?互斥锁、条件变量、信号量、屏障各自适用什么场景?