大家好,我是王有志。
原计划是今天结束线程的部分,但是写完后才发现,光Thread类的核心方法分析就写了5000多字了,所以不得不再拆出来一篇。
在02.关于线程你必须知道的8个问题(上)我们一起学习了如何创建线程,以及Java中线程状态,那么今天就来学习Thread类的核心方法。
Tips:
Java及JVM源码基于Java 11JVM源码仅展示关键内容,另附Open JDK链接文末附Java方法使用Demo的Gitee地址
Thread.start和Thread.run
上一篇中我们已经知道,Thread.run实际上是来自Runnable接口,直接调用并不会启动新线程,只会在主线程中运行。
Thread.start方法中调用的Thread.start0方法是真正承载了创建线程,调用Thread.run方法的能力。
其实到这里已经回答了它们之间的区别,接下来我们一起来看底层是如何实现的。
Tips:有面向对象编程语言基础的,看懂JVM源码对你来说并不困难。
首先是thread.c文件,该文件为Java中Thread类注册了native方法。
Tips:native方法是Java Native Interface,简称JNI。
第一眼就可以看到start0对应的JVM方法JVM_StartThread,实现是在jvm.cpp中:
接着来看new JavaThread做了什么,在thread.cpp中:
os::create_thread创建了操作系统层面的线程。这和上一篇中得到的结论是一致的,Java中的Thread.start0完成了操作系统层面线程的创建和启动。
个人认为Thread.run和Thread.start是没什么可比性的。如果被问到这个问题,要么是面试官懒,网上随便找找就来问,要么是技术水平确实一般。
Tips:
Thread::start方法在thread.cpp中os::create_thread方法在os_linux.cpp中,注意操作系统的区别os::pd_start_thread方法在os_linux.cpp中,注意操作系统的区别os::start_thread方法在os.cpp中
Thread.sleep和Object.wait
接下来看两个可以放在一起比较的方法:
Object.waitThread.sleep
很明显的区别是,它们并不在同一个类中定义,其次方法名上也能看出些许差别,“等待”和“睡眠”。
Object.wait
Java在Object类中,提供了2个wait方法的重载,不过最终都是调用JNI方法:
方法声明中我们能得知该方法的作用--使线程暂停指定的时间。
接着我们来看Object.wait的方法注释:
Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.
使当前线程阻塞,直到主动唤醒或者超过指定时间。清晰的说明了Object.wait的功能,另外也提示了如何唤醒线程:
Object.notifyObject.notifyAll
有了之前的经验,很容易想到Object.wait方法是在Object.c中注册的。我们找到它在jvm.cpp中的实现:
接着是ObjectSynchronizer::wait,在synchronizer.cpp中:
获取ObjectMonitor对象时,调用了ObjectSynchronizer::inflate方法,inflate翻译过来是膨胀的意思,是锁膨胀的过程。实际上,在未展示的代码中,还有偏向锁的过程,不过这些不是这部分的重点。
然后调用ObjectMonitor.wait,这个方法有225行,只看想要的部分:
答案已经呼之欲出了,ObjectMonitor.wait中退出了监视器,在Java层面就是Object.wait方法会释放监视器锁。
对不同等待时间的处理也需要关注一下,millis <= 0的情况下,执行的是Self->_ParkEvent->park(),除非主动唤醒,否则线程永远停在这里。在Java层面看,执行object.wait(0)会使当前线程永久阻塞。
既然都到这了,就多说一句,ObjectMonitor.exit中有几行关键代码,是synchronized特性实现的关键:
这些内容我们提前混个眼熟,后面在synchronized中详细解释。
我们来思考两个问题:
为什么Object.wait必须要在synchronized中调用?为什么wait方法设计在Object类中,而不是Thread类中?
首先,我们已经知道Object.wait的底层实现中,要释放监视器锁,释放的前提是什么?要先拥有监视器锁。那么在synchronized中调用Object.wait就很容易理解了。
其次,锁住的是什么?是对象,从来都不是执行线程(Thread实例是线程对象,不是执行线程)。因此涉及到监视器锁操作的方法是不是放到Object中更合适呢?
最后,如果你仔细阅读过Object.wait所有重载方法注释的话,你会发现一个词:spurious wakeup(虚假唤醒)。
这是没有主动notify/notifyAll,或者被动中断,超时的情况下就唤醒处于WAITING状态的线程。因此Java也建议你在循环中调用Object.wait:
简单解释下虚假唤醒产生的原因,我们已经知道Object.wait最终是通过Self->_ParkEvent->park()或Self->_ParkEvent->park(millis)实现线程暂停的,其调用的park方法位于os_posix.cpp中:
pthread_cond_wait和pthread_cond_timedwait是Linux对POSIX的实现,知道其作用即可,就不继续深入了。
我们很容易联想到,Object.notify的底层实现是调用os::PlatformEvent::unpark方法完成的。不出所料,从Object.c到ObjectMonitor.cpp,最后会发现该方法包含在os_posix.cpp中:
同样的,pthread_cond_signal也是Linux对POSIX的实现。Linux man page中对其的解释是:
The pthread_cond_broadcast() function shall unblock all threads currently blocked on the specified condition variable cond.The pthread_cond_signal_() function shall unblock at least one of the threads that are blocked on the specified condition variable cond (if any threads are blocked on cond).
其中第二段是关键,即pthread_cond_signal会唤醒至少一个阻塞在指定条件上的线程。也就是说,调用Object.notify可能会唤醒不止一个符合条件的线程。
Java层面有一个经典的例子--生产者消费者,只贴出产品部分的代码(全量请查看Gitee):
如果有1个生产者,多个消费者,消费者判定产品数量为0后,全部进入等待,生产者生产后,通知消费者消费,此时多个消费者被唤醒,直接进行消费,造成产品的总量为负数的情况。
改进的方法也很简单:
判断方式由if修改为while,不断地检查条件notify修改为notifyAll,避免死锁产生
Thread.sleep
首先是方法声明:
通过字面意思可以看出,让线程“睡眠”指定时间。再来看注释提供了哪些信息:
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.
最后一句非常重要,The thread does not lose ownership of any monitors意思是,使线程进入休眠,但不会丢失任何监视器锁的所有权。通俗点来说就是,我可以不用,但我不能没有。
Thread.sleep依旧是JNI方法,直接看JVM实现,在jvm.cpp中:
判断休眠时间millis,如果millis == 0,调用os::naked_yield(),源码在os_linux.cpp中,该方法会让出CPU时间。真是“大公无私”啊,但是唤醒是由操作系统决定。
Tips:Java 11对millis == 0的逻辑做了修改,可以查看Java 8的逻辑,我有点忘了。
也就是说,执行thread.sleep(0)并不是“咻”的一下什么都不做就结束了,而是真正的让出了CPU时间。
接着是else的部分,最关键的是os::sleep(thread, millis, true) ,调用操作系统sleep方法进入休眠,以对Linux的封装os_posix.cpp中的实现为例:
简化后就很好理解了,计算millis剩余时间,millis > 0调用park暂停线程,唤醒后继续循环,millis <= 0则表示休眠结束。
到这里Thread.sleep的内容也算告一段落了,分析的过程中没有发现涉及到ObjectMontior的地方,因此断定Thread.sleep并不会释放监视器锁的所有权。
Thread.yield和LockSupport.park
趁热打铁,来看同样拥有“暂停”能力的两个方法:
Thread.yieldLockSupport.park
Thread.yield
首先是方法声明:
还是熟悉的JNI方法。同样从注释开始:
A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore this hint.
这句话很好理解,提示调度器当前线程可以放弃处理器时间,但是调度器可以忽略。
直接来看JVM实现:
是不是很熟悉?和我们在Thread.sleep中看到millis == 0的场景不能说相似吧,简直是一模一样。
强调一下,Thread.yield只是暂时让出CPU时间,并不是不再执行,也没有释放监视器锁。
LockSupport.park
LockSupport.park常常会和Thread.sleep,Thread.yield以及Object.wait一起比较,趁这次一起说完。
从Java源码入手:
好家伙!!!LockSupport啥也不干,直接使用大名鼎鼎的Unsafe,那么直接分析Unsafe.park。
在此之前,还是要先看注释:
Disables the current thread for thread scheduling purposes unless the permit is available.
翻译过来就是,未获得许可的情况下,一直暂停线程。从表象上看和Object.wait很相似,但是别忘了Object.wait会释放监视器锁。
Unsafe.park
依旧是方法声明:
Tips:@HotSpotIntrinsicCandidate是Java 9中引入的,表示方法在HotSpot虚拟机中有高效的实现。
Unsfae.java的方法是直接在unsafe.cpp中注册的,实现也在unsafe.cpp中:
需要注意,Thread.sleep中使用的是os::PlatformEvent::park,这里调用的是Parker::park,在os_posix.cpp中:
Parker::park提供了两种场景,暂停指定时间依赖于pthread_cond_timedwait实现,对应LockSupport.parkNanos,不限时暂停依赖于pthread_cond_wait实现,对应LockSupport.park。
从源码来看,Thread.sleep中使用的os::PlatformEvent::park是简化版的Parker::park。另外,我们也可以得到一个隐藏结论:LockSupport.park并不会释放监视器锁。
Thread.join
先来看Java中关于join(long millis)的注释:
Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
比较容易翻译,等待指定的时间,或调用线程运行结束。如果指定时间为0,则会永远等待。
看起来又是关于线程“暂停”的方法了,我们来看源码:
逻辑很清晰,也没有调用太多JNI方法。看起来岁月静好,不过,我们先写一段测试代码:
现在我们提出两个问题:
谁在等待t1运行结束?什么时候唤醒的线程?
对于第一个问题,我们先来回顾下Object.wait的使用。ObjectMonitor::wait中调用os::PlatformEvent::park,操作的对象是当前执行线程,而不是调用对象。
Tips:这里有些绕,this.joinThread.join()的调用中,this.joinThread是线程对象,而不是执行线程,执行线程是Thread实例对象在操作系统层面的映射。
网上很多答案说,join方法阻塞的是主线程并不准确,个人理解在哪个线程中执行join方法(不是调用!!!),就阻塞哪个线程。举个例子:
这种情况下被阻塞的是线程实例对象t2在操作系统层面映射的执行线程。
接着我们来看第二个问题,在Thread.join的源码中,我们并没有看到notify/notifyAll方法,那么线程怎么被唤醒的呢?
这里直接给出答案,以上面的代码为例子,在线程t1执行结束时,JVM会唤醒等待的线程。也就是JVM层面执行JavaThread::exit时唤醒线程,源代码在thread.cpp中:
通过JVM的注释也能看出这个方法做了什么,不过我们还是一起来看ensure_join方法,在thread.cpp中:
代码最后一行,调用了notify_all唤醒了所有线程,也就是说,此刻所有调用Object.wait的方法都会被唤醒。另外也可以看到,线程状态被标记为TERMINATED也是在这个方法中完成的。
到此为止,Thread.join的原理也已经说完了,它的本质就是调用Object.wait实现阻塞,因此Java的注释中也会建议不要使用wait/notify/notifyAll:
It is recommended that applications not use wait, notify, or notifyAll on Thread instances.
Thread.interrupt
从关键代码开始:
如果没猜错的话,interrupt0依旧是JNI方法:
往下追之前,来看注释:
Interrupts this thread.
简明扼要,中断线程。
这时候相信你已经能够熟练的点开jvm.cpp了查看源码了:
跳过thread.cpp,直接来到os::is_interrupted方法,在os_posix.cpp中:
调用Thread.interrupt在JVM层面并没有立即停止线程,仅标记了中断状态,随后尝试唤醒处于sleep/wait/park的线程,真正的中断是从操作系统获取该线程的中断状态开始的。
结语
今天我们一起了解了Thread类中的6个方法,另外也学习了Object.wait,Object.notify,LockSupport.park和Unsafe.park,虽然没有提及Object.notifyAll,但它的原理和Object.notify完全一样,只不过多了一层循环。
最后我们再通过一张表格,来对比下线程“暂停”方法:
当然了,“暂停”的方式不仅仅有这些,还有一些会在JUC中涉及。
本篇文章代码仓库:Thread核心方法
好了,今天就到这里了,Bye~~
参考资料
Thread.run方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/classes/java/lang/Thread.java#l832
Thread.start方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/classes/java/lang/Thread.java#l7
Thread.start0方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/classes/java/lang/Thread.java#l8
thread.c:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/native/libjava/Thread.c#l44
jvm.cpp的JVM_StartThread方法:
https://hg.openjdk.java.net/jdk/jdk11/file/80abf702eed8/src/hotspot/share/prims/jvm.cpp#l2859
thread.cpp的JavaThread构造方法:
https://hg.openjdk.java.net/jdk/jdk11/file/d2137bd1e57d/src/hotspot/share/runtime/thread.cpp#l1623
thread.cpp的start方法:
https://hg.openjdk.java.net/jdk/jdk11/file/d2137bd1e57d/src/hotspot/share/runtime/thread.cpp#l463
os_linux.cpp的create_thread方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/os/linux/os_linux.cpp#l715
os_linux.cpp的pd_start_thread方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/os/linux/os_linux.cpp#l879
os.cpp的start_thread方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/share/runtime/os.cpp#l857
Object.c的wait方法的注册:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/native/libjava/Object.c#l44
jvm.cpp的JVM_MonitorWait方法:
https://hg.openjdk.java.net/jdk/jdk11/file/80abf702eed8/src/hotspot/share/prims/jvm.cpp#l602
synchronizer.cpp的wait方法:
https://hg.openjdk.java.net/jdk/jdk11/file/80abf702eed8/src/hotspot/share/runtime/synchronizer.cpp#l479
ObjectMonitor.wait方法:
https://hg.openjdk.java.net/jdk/jdk11/file/80abf702eed8/src/hotspot/share/runtime/objectMonitor.cpp#l1416
ObjectMonitor.exit方法:
https://hg.openjdk.java.net/jdk/jdk11/file/80abf702eed8/src/hotspot/share/runtime/objectMonitor.cpp#l905
os_posix.cpp的unpark方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/os/posix/os_posix.cpp#l1928
Linux man page对pthread_cond_signal的解释:
https://linux.die.net/man/3/pthread_cond_signal
虚假唤醒示例:
https://gitee.com/wyz-A2/JavaInterview/blob/master/Concurrence/src/main/java/com/wyz/thread/core/SpuriousWakeupDemo.java
jvm.cpp的JVM_Sleep方法:
https://hg.openjdk.java.net/jdk/jdk11/file/80abf702eed8/src/hotspot/share/prims/jvm.cpp#l3084
os_linux.cpp的naked_yield方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/os/linux/os_linux.cpp#l4132
os_posix.cpp的sleep方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/os/posix/os_posix.cpp#l562
unsafe.cpp的Unsafe_Park方法:
https://hg.openjdk.java.net/jdk/jdk11/file/83aec1d357d4/src/hotspot/share/prims/unsafe.cpp#l938
os_posix.cpp的Parker::park方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/os/posix/os_posix.cpp#l1988
thread.cpp的exit方法:
https://hg.openjdk.java.net/jdk/jdk11/file/d2137bd1e57d/src/hotspot/share/runtime/thread.cpp#l1782
thread.cpp的ensure_join方法:
https://hg.openjdk.java.net/jdk/jdk11/file/d2137bd1e57d/src/hotspot/share/runtime/thread.cpp#l1762
jvm.cpp的JVM_Interrupt方法:
https://hg.openjdk.java.net/jdk/jdk11/file/80abf702eed8/src/hotspot/share/prims/jvm.cpp#l3164
thread.cpp的interrupt方法:
https://hg.openjdk.java.net/jdk/jdk11/file/d2137bd1e57d/src/hotspot/share/runtime/thread.cpp#l823
os_posix.cpp的is_interrupted方法:
https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/os/posix/os_posix.cpp#l638
Thread核心方法:
https://gitee.com/wyz-A2/JavaInterview/tree/master/Concurrence/src/main/java/com/wyz/thread/core
举报/反馈
—民族音乐赏析会—
济南起步区第二届黄河文化季暨济南市公益演出走基层活动
为传承中华优秀传统文化,弘扬优秀民族音乐,守住中华民族的根和魂,让民族音乐走进同学们的的精神生活里,让民族音乐焕发出勃勃生机。2022年10月31日下午,在济南市文化和旅游局的指导下,由济南市起步区社会事业部联合济南歌舞团组织的“泉韵飘香”民族音乐赏析会—济南起步区第二届黄河文化季暨济南市公益演出走基层活动在山东齐鲁技工学校隆重举行。学校领导及全体师生齐聚操场,共同欣赏这场音乐盛会。
下午14:00,同学们满怀期待,秩序井然地来到学校操场。伴随着悦耳动听的打击乐音乐会拉开帷幕。本场演出汇聚了打击乐、新疆民歌、琵琶独奏、男子独舞、科幻魔术、唢呐独奏及不同省份的经典民歌等多种艺术表现形式,内容丰富多彩、形式多样、地方特色鲜明,经典贯穿演出全程。01《夜深沉》演奏:高进02《手挽手》演唱:刘清杰 同学们和着音乐,打着节拍,沉浸在民族音乐文化中,感受了中华音乐文化的无限魅力,为日益强大的祖国感到自豪!
03舞蹈《蓝色印记》表演:李君豪04魔术《科学之谜》表演:任虎05《沂蒙山小调》 演唱:杨柳青06《桃花红杏花白》演唱:韩 霞07唢呐《百鸟朝凤》演奏:高 飞08《我和我的祖国》演奏:全体演员 乐器的和鸣,缠绵而悠扬;歌唱家的歌声,优美而动听。最后,在《我和我的祖国》的歌声中,音乐会圆满落幕。
本场演出充分展现出我们国家优秀民族音乐丰富而独特的艺术魅力,在弘扬中国传统文化精神与力量的同时,也加深了同学们对于中华民族传统价值观的理解与感受。
举报/反馈
我老公如果跟女演员拍重要的戏的时候,我会帮他把漱口水、口香糖所有东西都准备好,
伊能静:我甚至会把他前女友写给他的东西什么的,会帮他放到盒子里,帮他收好......
01
这就是伊能静谈到秦昊和女演员拍亲热戏自己的状态,当然,她所说的重要的戏就是和其他女人发生很亲密亲热的事
伊能静:比如说学生时期的第一次牵手
02
伊能静表示,最后我还是他爱的那个人,他牵我的手他可能很快乐,但是在学生时期的他,第一次碰上女孩手的时候的那种怦然心动
作为妻子的伊能静,想要帮秦昊保留守护,说到这里,伊能静也告诉自己不要去侵犯它,因为她觉得人生里真的有好多回忆是无法取代的......
03
这就是伊能静对于自己丈夫前任的态度,是不是挺大度,是大体的?见到很多人多是谈到前任就色变,不管前妻还是前女友,这都是一个非常敏感的话题
也总有人在成为伴侣的最后一任后,对前任发起抨击,也想磨灭老公这份回忆,甚至质问老公为什么当时要牵她的手?你为什么要去吻她?
04
但是很少有人像伊能静这样想法:在我认识你之前,我尊重你所有的决定和回忆,并且如果有需要用到这些怦然心动的情感,我会帮你保留它
真的觉得这是一种睿智和洒脱,确实没有一定的阅历和格局,真的做不到伊能静这样。以前小巴也觉得伊能静能嫁给秦昊,一是她很漂亮,保养得好,二是她成名比较早,或许在资源上可以帮助到秦昊
2人只是各取所需在一起,但是现在看来,是小巴狭隘了,两个人真的是灵魂上的互相契合,年龄差距大是事实,但是我觉得年龄不应该成为爱情当中不可逾越的障碍,两个人心灵上的沟通才是根本
05
有人说,伊能静这么大年纪还作还撒娇,让人受不了,但其实撒娇作只是她表现出来的一部分,伊能静的生活全部不只是作和撒娇,还有她对于女儿的照顾,对家人和公婆的爱护,以及对于和前夫儿子哈利的培养
如果她只会撒娇怎么会把家人两个家庭照顾得好好呢?当然,对于伊能静的想要的浪漫,秦昊不能给予也不想给予,但是除了浪漫之外,秦昊的有责任,有担当以及他父母的三观,也给了伊能静需要的安全感
06
小巴,印象比较深的一次是伊能静带着女儿和秦昊一起上节目,当时在睡梦中突然听到客厅的秦昊说了一句怎么搞的,伊能静瞬间就机灵起来了,她马上下地追问秦昊谁?怎么了,怎么了,发生什么事情了?
后来知道儿子哈利在跳舞时脚趾头受伤了,因为父亲庾澄庆在京都,睡梦中惊醒的伊能静立马就告诉秦昊,说自己得回去一趟看望儿子,也会和秦昊关系稳定后代哈利生活在一起,可以说在母亲这个职位上她做得很出色,尤其和前夫庾澄庆的关系处理的也非常好
07
伊能静在国外生女儿的时候,说有一次儿子哈利准备送给小后妈一个礼物,但是担心自己看到会不高兴,伊能静理解儿子的复杂心情,就找机会告诉儿子:妈妈怎么可能不高兴呢?妈妈爱你,爸爸爱你,爸爸妈妈当然也希望我们爱的人也爱你......
伊能静:因为又多了一个人爱你,妈妈高兴还来不及呢
08
还鼓励儿子做的是非常对的,真的感觉一个人的成熟,一定是因为之前的顺境或逆境增长的经验智慧,她懂得适当委屈自己,让大家的关系更融洽
伊能静14岁的时候就开始挣钱养家了,因为小的时候,妈妈告诉他,你要不出去挣钱,我们家就会被泼油漆,门就会被锁,她开始做服务员,后来在酒吧唱歌,小小年纪就抱着一堆现金回家还债
结语
如果说我们出生在平地的话,伊能静这样的就是在坑里面,也遭遇了第一次不幸的婚姻,可是最后他还是靠着自己的隐忍上进和自律,一步步把生活经营得很好,没有人能顺风顺水一辈子,但是能做自己的孤勇者,又何尝不是一种英雄呢?
而在情感中,越是像伊能静这样尊重老公的以前和回忆的,反而越能得到老公的尊重,你认可伊能静这种做法吗?
举报/反馈
十月生日会达成所愿HAPPYBIRTHDAY
一岁一礼,一寸欢喜生活明朗,万物可爱9-10月份生日会如约而至祝愿所有寿星们和小伙伴们幸福美满,永远健康快乐岁月静好,开心不请自来接下来让我们一起共享生日会的美好时光吧
01热身小游戏
行政人事部的小伙伴们提前为大家布置好了场地,并且为大家准备了会前小游戏
02寿星闪亮登场
本次生日会由行政人事部经理冯松松女士为我们主持,业主代表梅平阳女士为各位寿星们送上了生日祝福,并为寿星们切生日蛋糕
03生日会进行中
欢乐满满
精心布置的生日会现场,丰盛的零食、饮料、生日蛋糕贴心的生日礼物给9-10月生日的家人们满满的生日仪式感生日会的前期家人们纷纷拿出了自己的“拿手好戏”,为大家带来了一首首动听的歌谣;紧接着进入了游戏环节行政人事部的小伙伴为大家准备了鼓传花和抖乒乓球游戏获胜的寿星们将会获得精美奖品一份
美好的时光过得飞快不知不觉中生日会已经结束了祝大家生日快乐,不止生日愿世世经历日出日落,愿事事都能闪闪烁烁我们下期再见喽~
-END-
举报/反馈
任何走势在图形上都是要完成的所以,画图,严格意义上讲,需要缠论的全部知识,尤其是对结构的正确把握才能画出名堂比如,一个图画出来后,你要能感觉到走势在生长,在转化,在花开花谢缠论的全部东西,都要在图上体现出来,包括你能观察到的中枢,走势,级别,扩展,走势类型连接,小转大,买卖点,等等,都应该在你画的图形上感觉出来那么线段和笔的机械划分,就无法体现这些东西做不到这点,你的图形只是机械的分解,必然错误画图的过程中,你能清楚感觉到缠论的东西在里面是如何体现的看图形必须明白以下几个东西首先是,级别我们画的,实际走势找一个线段的起始点和结束点那么走势级别和图形级别之间的关系就是这样的1F走势类型---在5F图中显示为线段,笔中枢为1F中枢----在30F图上体现为一笔-----日线图上体现为1-2K重叠5F走势类型----在30F图中显示线段,笔中枢为5F中枢----在日线图上体现为一笔(中枢体现为3-15K)重叠----周线图体现为1-2K重叠30F走势类型-----在日线图显示为线段,笔中枢为30F中枢(包括15-20k)左右重叠---周线一笔(中枢体现为5-15k)左右重叠这就是常用的走势级别和图形级别之间的关系举个例子这个是周线图,那么每一笔,就是30F级别其中的5-15K左右的重叠,就是30F中枢,这就是图形和走势级别的关系。实际就是我们经常说的,30F级别走势类型看日线图线段,5F级别走势类型看30F图线段,1F级别走势类型看5F图线段。而其中的笔中枢或者20K左右重叠的部分,就是该级别走势的中枢。怎么看图看图要注意以下几点,第一个,从大往小看,比如,级别越大,看的图就要越大,举个例子,你做日线级别,至少图形级别首先看周线,30F级别,至少看日线图,5F级别,至少看30F图,这样能锁定整个走势的大方向和结构。对于走势很乱的票,不要到小级别图上去画线段,直接看大级别图过滤我们用大级别的图锁定了目前走势的位置,这样才能找到走势未来最大的机会。原理是,用大级别图的线段来画,然后笔中枢或者20K左右重叠的部分作为该级别。同样,30F走势乱七八糟的,日线画,5F走势乱七八糟的,30F图上画。这样走势的层次感就出来了,大方向也出来了,目前的位置你也心中有数。因为我们知道,周线一笔是30F走势,那么问题就全部解决了。第二个,锁定大图后,然后你的分析就从当下那笔去看我们所有的分析画出来后,前面的就不管了,我只需要研究7.25以后的走势,那么我们知道这是30F级别,周线一笔,那么就看日线图,一定该记住哈,前面的就不管了,只看你需要分析的那段就可以了。日线图是上这个结构日线图对应的那个周线一笔,就是这个结构,明显是30F走势而7.25以前的,在周线图上已经走完了的结构,一概不管了,这就是区间套。大级别图上锁定方向,小级别图找你分析段的内部结构,确认起始点和终结点,那么两个东西我们综合起来看一个图。这个图日线的,乱七八糟,不管,看周线图去周线图就明确了,是个日线级别下趋势背驰票那么,1这里我没进,没发现他,但2这里的时候我发现了,那么我分析下到2这里的结构,2这里进去了,那么,2开始至少是个30F上,对吧,周线一笔,那么就看着日线图。日线图上,2这里的终结点很明显的,2开始就是30F上,那么你按线段,笔中枢,K线重叠理论分析走就可以了。这些例子就是我刚才讲的,从小级别图上乱七八糟的时候,就用大级别图的线段和笔中枢过滤,然后在你的关注点之前的完成走势,注意是完成走势哈,一律不再关注,只需要记住大走势是个什么级别就可以,知道这个大的走势后面分类就可以。其他的,不要去划分了,就从你关注点这个未完成走势或者完成走势的最低最高点开始,用小级别图分析,这是画图的第2个技巧。同样还有一只票,也是我刚过的,日线图极其乱那么继续周线,用线段和笔中枢搞定它
周线图就非常清晰了。严禁随便截取一段就开始划分这是初学者最大的毛病,因为走势是生长出来,前世的因决定了现在的果所以,你每次操作的段,都要确认在大级别是个什么位置,这样你才能确认你最大的机会。比如,日线级别下,在趋势背驰形成前,你最大的机会只能是30F,一旦30F走完,你就必须退出,等待演化。30F下,你最大的机会就是5F的。如果日线还没下完,就指望日线上,那么你的操作不是电梯就是绞杀这就是大图看方向,看目前位置,找操作机会,小图区间套,找买卖点的利器,因为这就是节奏,就是方向,也整因为这样,你的图形,千万别随便截取一段就分析,分析不出来的,因为你不知道走势现在总体在什么位置上,你的机会有多大。比如,日线级别的下,那我按照分类,至少知道,不是日线上,就是周线盘。那我继续组合,日线上,至少30F三段,上下上,第一个上我做完了,目前我回避第二个30F下,下到底我再进去,那肉肉就出来了,何况理论涨幅最低点根本没到。这样的分析和操作,才能让你对走势有个整体感,才能更好的把我机会,明白没?很重要哈,这是让你在走势中不迷失的关键所在。否则,天天小级别里面折腾,那方向永远是迷失的同样,5,1F级别的操作,都是这个道理,大级别找方向,找机会,小级别图上找买卖点。画线时如何确定起始 结束点也很重要按背驰转折三个分类来看,标准背驰肯定是最高最低点,不标准的就不是最高最低点了。怎样画图画图最基本的要求,就是反映出走势的真实面目,直接点说,就是你的起点和终点,一定是走势的终结点和起始点,而不是什么最高最低点,因为小转大的时候,我们知道,那走势的终结点不在最高最低点的,这个需要你们在全面掌握缠论的结构极其演化,才能画出来。有人问,为什么我画笔有时候不是最高最低点,简单啊,因为小转大的时候,走势的结束点是次高或者次低点。比如,三个1F走势合成,5F,我们在30F图上画就是这样的而5F图上那种这个不是最标准的画法道理很简单,这个是最高最低点画法,而不是转折点画法,而走势真正的画法应该是转折点画法,就是一个走势真正结束的地方,按照理论,我们知道一个走势结束的地方,肯定是背驰段或者转折点,那个最高最低点不是转折点。画图的具体技巧是充分利用K线重叠和走势类型连接,举个例子这个图, 不熟练的,就一点一点分析这走。高点下来,5F趋势,背驰,引发30F盘整(缠的趋势背驰后的三个分类)然后30F盘整后,连接5F下,目前5F第二中枢构筑中,这样总体我们就画出来了。就是从上到下,根据K线重叠数量,和走势类型连接,推断出走势,后面的大形态,30F盘,然后盘整连接次级别以下级别的走势,然后看次级别的中枢位置,等次级别结束后,再去比较是否30F背驰。这才是真正的画图因为你这么画,体现了走势的生长过程,真实反映了走势的全貌,任何地方都没违反缠论的核心理论,趋势,盘整,小转大,背驰,扩展,走势类型连接,等等,都体现出来了。如果你画的图不能体现这一些列的级别生长演化过程,那你的图一定是垃圾,而线段理论,就是创造垃圾的最有效工具一般情况下,面对一个线段,够笔就按笔画,不够的,按20K线重叠画,特殊的地方比如小转大的,就不要画到最高最低点就成了,一字板和跳空这些,是最低级别的,不管,只管其他的K线重叠就可以了,图形只能多画,画的越多,感觉越好,你们平时自己多练习,一般,看明白次级别,次次级别,就可以了,更细的,看更小的图就成。举个例子日,周都很乱,那么到月图去看,那么月图,肯定对应周线级别走势,那么先找到周线级别中枢这样大方向就出来了,目前是周线下1这里是盘整背驰,则,1开始,肯定是日线级别上,1以前的就不管了,那么现在就看1这个日线级别的结构,当然就看周线图了。那1这里的日线级别上,在周线图上,我们看到了中枢没出来,因为至少三个30F级别重叠,12.75开始这里的上,不是30F的,但没关系,因为中枢连接段可以是次级别以下任何级别,那么,从高点下来的结构我们至少知道,是下上下,三个30F合成日线上的中枢。好,大方向出来了,现在进入日线图日线图上,我们看到了5F趋势上+30F下,这个下就是日线中枢第一段,那么目前的重点,就是关注这个30F是否走完,由于这个30F下目前无法确认走完,因为还只是30F中枢震荡,那么目前理论保证的最大机会就是5F上,也就是16.16到现在我的操作,后市关注的重点就是,这个5F上是否演化为30F上,这就是全部的级别,结构,和区间套方法,以及你的策略,都在其中了。这样大方向,小结构,最大的机会和策略,都在你掌控中,级别,就是解决层次感的,周线图没走完啊,你怎么能看出来,目前只走了日线中枢的第一段下,我们现在确认的就是第一段下是否走完,完了,必然是个30F上冲击到23上下,完成日线中枢第二段,也就是说,这个251欠我一个30F上。月线图的方向,就保证了日线级别的上嘛,所以画图,大级别确认走势方向,大节奏,和你的最大的盈利级别,小级别确认买卖点和精度,去区间套,缠论,必须是各个级别通用,各个级别的图形通用,才叫缠,因为这样才能体现缠的结构的自同性,小图小方向小盈利,大图大方向大盈利画图就是同级别分解。比如,周线图,每笔都是30F的,那你画出来的每笔,必须都是30F,不能拉掉所有的K线。画图是为了理清走势,便于分析和操作,如果你画的图,没法分析和操作,那一定是失败的我画图,就是靠线段判断次级别,笔中枢就是次级别中枢,这样判断线段是否终结,终结了,那次级别就结束了,一个新的次级别开始,线段结束,一个走势就完了。你5F走势,30F看线段;30F级别,日线图搞线段。分析,记住最后一个1F走势就可以了,这个1F走势,只要不影响到5F转折,基本就可以不管.1都没终结,那么5F怎么会结束,5不结束,30F根本就不用担心 分型是K线重叠里面必须的东西,而且K线重叠还能更好的解决级别和K线重叠数量的关系,更能解决中继分型的问题画图不是一朝一夕的事,如果画图真的如缠师的笔和线段那么简单,那缠论太好学了,所以,慢慢来,急不得哈,画图靠的是对走势结构的深刻领悟和准确把握 ,绝对不是按线段那样机械的肢解走势。画笔和分段我做了重新的定义哈 ,目前画笔的正确率能达到90%,体现走势原貌,分段是100%了,目前的分段体系非常爽哈 ,讲起来太多了,没法讲的 ,分段的核心,就是划出走势原貌。和什么线段划分没半毛钱关系,一定按照走势原貌来划分,这样递归才能没任何问题,背驰才能当下。背驰和指标没半毛钱关系,别研究指标,我说实话哈,线段操盘难度极大,主要是没秒图,转折点判断误差极大的。分段现在涉及到核心的东西,因为我的分段是按照走势的转折点分类来划分的,一旦对外,转折点判断必然泄密了。我一下子说不清,我给你指条路,就是分段,一定按走势原貌来。根子就是划分到走势的起始点和终结点上,这样才能真正体现出走势的真是面目,而起始点和终结点,就涉及到走势转折的方式和背驰的判断,所以,画图实际是缠论综合能力的大检验哈,不是为画而画的。图拿不下,啥都别想了A0,这个可以随意设定,功力高的,笔或者K线重叠作为A0,功力浅的,把1F级别当A0,甚至五分当A0都可以。外汇走势比较快,自然要复杂一些,但结构的同构性永远不会变。我呢,也是最近才总结出走势分段的方法,我用了4年半,这个分段必须对走势认识深刻了,才能彻底明白的,话说缠师怎么不开始就讲笔和线段之类的东西,而是直接讲走势呢?所以你们先去熟悉走势。时间长了,自然分段就搞定了哈,走势就是盘整和趋势。如果你们对走势有了深刻的了解,你们一样会否定线段的,但遗憾的是,99%以上的,只会机械划分线段,,根本不知道走势的内在规律。还有,如果谁能用缠论的核心定理证明线段的两种划分方法是唯一和正确的,那我就相信线段是绝对的牛,包括笔,谁能证明笔的划分方法是唯一和正确的。线段找钱?亏多赚少哈,而且全是小级别折腾,所以我对线段没兴趣,我研究的是级别,以及其演化和生长规律,分类和临界点的确认,缠师前期中期何时用过线段和笔?走势一样清晰无比。。你用后期的线段和笔,缠师的原图你都看不懂。大盘这里,主要是构筑周线中枢,因为底部上来是周线上,那么,如果周线不小转大,周线中枢必然完成,这意味着,大盘3000-5000,要横很长时间了,大致区间和标准走势的话,就这个哈,当然,小转大的话,回到3000一下玩玩不是不可能,周线中枢,三个日线级别走势,9个三十分,怎么也的一年以上了,我现在只做中小板,大盘缺量的情况下,中小盘反弹涨幅会很大,说创业板不能碰的,缠论外行,五分级别的肉,现在很多都是15%以上,缠论眼里,没有啥票是不能碰的,无非是赚多赚少的问题,缠论操盘,讲究的不是一次大赚,而是每次必赚,用复利实现账户奔小康,所以,复利就是最大的黑马,缠师的原话,只要你能一辈子生存在股市,你的理论就是牛的。但作为缠论操盘的,能还原缠论原貌是最好的,体现缠论威力才是最牛的,这就是我要干的事,还原缠师真正的缠论原貌和威力,但是还原,不等于把缠论当圣经哈,核心理论我坚持,这是缠师证明了得100%正确的。缠论核心17课到讲线段之前,都是后面有的课,也是,但量不大,实际我眼里,最重要的,只有那么8课左右。熊市一般最大机会就是五分,把握五分机会就可以了,背驰是缠论中仅次于线段无需研究的东西,精通结构后,背驰一眼就看明白了,所以,我讲课,从不讲背驰哈,最不值得的,就是线段。笔都可以看看,就是这个线段,垃圾到了极点,尤其是线段划分的标准,非常扯淡的东西,什么特征序列分型,,啥玩意?我今天分解的大盘,讲过了线段有多可恶,生死不知,方向不明,无法判断背驰,破坏级别,机械肢解走势,。。。这么个玩意值得学吗,最终恶果,崩塌递归体系,都这样了,你还学,你死定了,线段的问题极其严重。缠师试图用一句话来抹平这些,但实际根本无法抹平,缠师的原话是:在该级别图表下,次级别以下都可以看成线段,虽然这些线段可能是不同级别,最后这句画非常要命,最后这句,就是崩塌递归体系的根子,我找出来给你们哈。这句话,很麻烦,意味着线段可能不是同一级别,那么如果不同级别的线段连续组合在一起,会发生什么?结果只有一个,崩塌递归体系,这样区间套就完蛋了,背驰也就没戏了,尤其是中枢,中枢必须是次级别构筑,你来了个线段可能不是次级别的,,你的中枢那究竟是什么级别?而中枢级别出现纰漏,那么整个走势呢?非常要命的哈,我是被害惨过,这些提法,本身就是违背缠师自身核心理论的,完全无法经得起证明和推敲。缠师对线段是很反复的,修改至少三次以上。1,笔的两次修正,线段自然反复2,刚开始是,对着图表,都是线段3,后来把线段确定到一分图,其他用递归这些明显的修正,都表明,线段无法在各个级别通用,现在很多人,觉得缠师第三次这个,也就是线段只能用在一分图,但即便一分图也是错的。他想给大家一个现成的A0,但遗憾的是,不成功,108课中,线段为什么占了这么大的篇幅,就是缠师在不停的修正,但越修正,问题越大,缠师自己的A0肯定是有的,就是次级别,缠师想用线段完全取代次级别,没成功,不说了,今天说的太多了,再说下去,我的笔和分段方法就都给你们了。线段里面只有几个东西值得你学,1,明白线段必须是至少三笔,三笔重叠,2,明白线段被破坏的第一种方式,线段只能被线段破坏。知道这两个,就足够了,然后除此之外的线段的东西,全部当垃圾扔掉。对于第一个,线段至少三笔,实质就是走势必完美的,任何级别走势至少三个次级别走势构成,这个是符合缠论核心理论,必须坚持对于第二个。线段必须被线段破坏,本质是讲的走势的生死轮回,也是符合核心理论的,新走势出来了,老走势自然死了除了这两个,都是垃圾,都不符合缠论的核心理论我的分段只保证,笔是次次级别,线段是次级别就可以,分段的界限就是走势的生死点这样确保分解时走势原貌的分解,递归体系是最准确的递归体系,具体理论一个也不讲,我只给方向,不给理论。
举报/反馈
说孙楷第先生的《小说旁证》是一部让人等了半个多世纪的好书,这决非夸饰之语。事实上,从1935年该书首次在《国立北平图书馆馆刊》选载发表到如今,已经过去了80多年。早在1953年,郑振铎先生就曾“盼望它能早日印行”,并说“凡是有益、有用的书,都是值得,而且应该为读者所见到”[1]。但他的话并没有应验,其本人生前就未能见到这部“有益”、“有用”的学术著作出版。
《小说旁证》
在此后的很长时间里,除了《文献》、《文学评论》、《文学遗产》等刊物刊发零星的几篇外,人们一直无缘看到全书。就连受其影响而成书的谭正璧先生的《三言两拍资料》都已经出版了近半个世纪,并多次再版。但不管怎样,这部令人悬想半个多世纪的学术著作毕竟在上个世纪即将闭幕之际得到了面世的机会。
孙楷第在中国小说、戏曲研究史上的地位应该说是早有定评。1932年,当年轻的孙楷第先生还刚踏入学术殿堂,在小说史研究上已有不俗建树的胡适就盛赞他是“今日研究中国小说史最用功又最有成绩的学者”,认为其正在着手的小说目录学在小说史学上“绝大重要”,“《水浒》、《西游》、《三国》、《封神》、《说岳》、《英烈传》、《平妖传》等书的历史的考证,必须从新建筑在孙先生现在开始建立的小说目录学的新基础之上”[2]。
这话显然不是胡适碍于情面的泛泛夸赞,在当时颇有预言性质,同时也可见出胡适不凡的识人慧眼,早在十多年前,他就曾向当时中国出版界的龙头老大商务印书馆力荐年轻有为的王云五担当重任,这后来成为胡适十分得意的人生精彩之笔。
回顾孙楷第先生一生的研究实绩,可以说他是当得起胡适这一赞誉的。尽管他从事小说史研究比鲁迅、胡适等人要晚了很多年,没有开风气之先的机会,但他从版本目录学着手,穷毕生精力,以乾嘉学风专治小说,仍然以自己卓著的学术成就开辟了小说史研究的一条新路。他研究小说的方法正像胡适所言,虽然“无它巧妙,只是用目录之学做基础而已”,但“这是最稳固可靠的根基”[3]。
鲁迅、胡适也都曾以乾嘉学派的治学方法进行小说史研究,这也是当时多数学者进入通俗文学研究的一条门径,但就他们一生的事迹而言,只能说是偶一为之,都未能像孙楷第先生这样以终生的精力全力投入。仅就小说史研究所取得的成就而言,孙楷第先生是可以和鲁迅、胡适鼎足而三的,可以当得起后人所称誉的“古典小说戏曲研究的现代第一人”。
孙楷第先生
以乾嘉学派的方法治小说,这是孙楷第先生根据自己个性和爱好自觉选择的治学道路,也是其留给学界最深刻的印象,但它只是其学术研究的一个组成部分,正如小说史研究不能概括其全部成就一样。
就像杨镰先生所总结的,孙楷第先生研究小说有一个很宏大的设想,那就是博览群书,打通四部,先从版本目录、训诂校勘等朴学方法着手,进行整体的考察梳理;然后撰写书目提要,钩稽小说本事,辨析作品源流;最后再融会贯通,由微观的梳理辨析进入整个小说发展史的探讨[4]。
这是一条非常大气但很有风险的道路,说大气是因为建立在这种朴学基础上的小说史研究根基扎实,步步为营,真能推动学术的前进,比那种读了没几部书就中西五百年大比较的路数不知道要高明多少;说风险是因为这种研究因其过于严密精细,需要太多时间、精力的投入,而且仅仅依靠个人的毅力和精神还远远不够,它还受制于许多外界条件,比如学术风尚的变迁,像其《戏曲小说书录解题》、《小说旁证》都是在成书半个多世纪后才得以出版面世。
《戏曲小说书录解题》
不难想象,在不少高等院校、科研机构将书目、资料汇编逐出学术专著殿堂的今天,如果《中国通俗小说书目》、《日本东京所见小说书目》不是在先前就已获得很高学术声誉的话,它们是否能得到出版的机会;比如个人的身体状况。
事实上,晚年的病痛使孙楷第先生失去了很多宝贵的科研时间,且不说十年动乱使他珍藏半生的图书资料化为乌有,对其造成无法弥补的工作上的干扰和心灵上的创伤[5]。他的小说研究三部曲最后只算是完成了第一部。其《中国通俗小说书目》、《日本东京所见小说书目》早已成为小说史上的经典之作,前者被郑振铎称为“最好的一部小说文献”[6]。出版甚晚的《戏曲小说书录解题》也同样为学术界所看重。
自然也不难想象,如果孙先生能有机会完成其设想中的科研计划,这对小说史研究者该会是一笔多么珍贵的学术遗产。
《小说旁证》可以说是孙楷第先生小说考源、本事梳理工作的总结。这是他倾注毕生心血的一部学术力作,黄克先生在书后的《触类旁通读旁证》一文中以孙先生写于1972年的一则按语为例,说明其“从1935年到1972年,近四十年都在经常地整理此稿”。
笔者这里还可举出一例,在该书第137页“新安人”一词后有一个较长的注释,云“《亘史》、抄本《文苑楂橘》‘新安人’皆作‘少年’。《情史》文与《别集》同,皆作‘新安人’。余三十馀年前读而疑之,不知其文字所以不同之故。后读《亘史》本《负情侬传》,传后有之恒跋云:‘本传少年作新安人。吾不愿与同乡,故削去。’始知作‘新安人’者,是传原文。作少年者,是之恒所改。《文苑楂橘》自《亘史》出,故亦作‘少年’也”。
对区区一个词的考察竟三十年而不忘,可见其治学之严谨之执着,也可见其对该书所倾注的心血。
《小说旁证》
不过,《小说旁证》只能说是完成了一半,因为从其全书可以看出,其所涉猎的仅是话本小说,即使如此,还有很多话本小说作品未能论及,后出的谭正璧先生的《三言两拍资料》和胡士莹先生的《话本小说概论》所涉及的篇目就比它要全得多。
当然,这种着眼于篇幅数量的对比是不公平的,因为它淡化了《小说旁证》一书的首创意义,笔者之所以这样说,意在强调《小说旁证》的成书要远远早于上述两书,同时还要说明的是,孙楷第先生是现代最早进行三言二拍源流考溯、本事钩稽者,早在1931年,他就在《国立北平图书馆馆刊》发表《三言二拍源流考》一文,探讨三言二拍的本事源流,随后又写有《重印今古奇观序》附解题[7],《小说旁证》是这一工作的延续和总结。
但即使是这样,在今天看来,它也并非上述两书所能替代。因《话本小说概论》属论著,非资料汇编性质,限于篇幅,不能过多摘引原文,更多的只是点出小说本事的出处,所以这里拿《三言两拍资料》与《小说旁证》进行对比,不过这种比较并非判定两者的高下优劣,而是为了借此凸现《小说旁证》一书的特色。
《三言两拍资料》
《三言两拍资料》初稿完成于1959年,“所收资料,以出版于建国以前者为准”[8],可以说是20世纪上半叶对三言二拍本事研究的一个总结。此前已有郑振铎、赵景深、叶德均等人的成果可以借鉴,其得益于孙楷第先生研究处更多[9],其书后的参考书目就列有孙先生的《中国通俗小说书目》、《日本东京所见小说书目》以及在《北京图书馆馆刊》、《文学评论》发表的数则《小说旁证》,并且书中有一部分资料系直接转引自《小说旁证》,如其第224页所引《明十六种小传》卷三《沈小霞妾》、第354页所引《九龠别集》卷四《负情侬传》、第586页所引《九龠别集》卷二《刘东山》等,至于受其启发而没有注出的当会更多。因为是后出,能够参考利用先出的诸家成果,所以收录较全,这是后出的优势和特点。
不过,将两书比照来看,《三言两拍资料》一书还不能取代《小说旁证》。
首先,《小说旁证》除三言二拍之外,还钩稽了30多篇其他话本小说的本事资料,范围较《三言两拍资料》为广;同时《小说旁证》所据的一些书籍较为珍稀,为《三言两拍资料》作者所未见,如《耳谈增录》、《九龠别集》、《明十六种小传》、《续艳异编》等书中的一些资料,就因谭先生未能看到原书而失收。何况同一作品两书所收资料也不尽相同,正可以相互进行参照。
其次,《小说旁证》更为严谨精良。这首先表现在:
其一,对所收材料选择较严,只收那些确实对作品创作产生影响、构成渊源者,至于仅在情节上相似而没有直接影响者,一般不收。
天许斋刊本《古今小说》
如《古今小说》卷六《葛令公生遣弄珠儿》,孙先生取《说苑》卷六有关部分为本事来源,《韩诗外传》卷七也载此事,但“以非话本所本”,就没有收录;再如《醒世恒言》卷二十六《薛录事鱼服证仙》,《小说旁证》只收《续玄怪录》卷二《薛伟》,《广异记》和《酉阳杂俎》中有关记载虽然情节相类,但因为“词皆简质,非话本所本”,也没有收录。相比之下,《三言两拍资料》收得就比较宽泛些,上述《小说旁证》不收的资料皆予以收录。
其二,《三言两拍资料》大体只提供一种版本的文字,对于不同版本间的文字差异,只是在本事材料后进行简短的说明,而《小说旁证》不仅对所选本事资料精心挑选底本,尽量采用较好较早的版本,所收文字也大多经过精心校勘,并标出异文,有不少还以多种不同的版本参校,这样就为读者提供了十分可信的文本。因全书所收材料大多取材自文言笔记,本身也属小说作品,所以该书也可以看作是一部校勘精良的文言小说选集。
从中我们可以领略到孙楷第先生以乾嘉学风治小说的学术风范。在中国现代学术史上能够依如此执着精神和严谨态度研治古代小说的,除编撰《古小说钩沉》、《唐宋传奇集》、《小说旧闻钞》的鲁迅先生,第二个就要数孙楷第先生了。
《日本东京所见中国小说书目提要》
从《小说旁证》一书来看,孙楷第先生根据中国古代小说作品的具体情况,采用了多种校勘方式,可以说校勘古代小说所遇到的各种情况在该书中都有涉及,因此,该书也可以看作是古代小说校勘整理的一个范本。
总的来看,该书主要采用了以下四种校勘方式:
第一种是不同版本间的校勘,即选用一种较好的版本作底本,再用不同的版本参校。
比如全书本事资料采自《齐东野语》部分,选用涵芬楼印本为底本,这个本子系夏敬观据现存最早的元刻明补本整理而成,校本则采用据明正德刊本重刻的汲古阁刊本,这是目前所见到的《齐东野语》最好的两个版本。选定底本、校本后,再根据文句的情况酌情校改。经过这样校勘的文字无疑是十分可信的。
其它如采自《效颦集》据日本旧抄本为底本,以明刊本参校;采自《灯下闲谈》据涵芬楼校印本为底本,以《适园丛书》本、原本《说郛》卷十一参校等皆是如此。
第二种是不同作品间的校勘,这是该书应用最多的校勘方式。
中国古代小说作品在题材、情节方面传承较多,往往是一篇作品产生后,被稍作修改,再收入别的小说集,由一篇作品衍生出人物、情节大体相同的一类作品。这样,将由同一篇作品所衍生的作品放在一起校勘,不仅可以比较人物、情节间的异同,也可以借此订正一些文字上的讹误。
比如《警世通言》卷三十二《杜十娘怒沉百宝箱》,孙楷第先生收录《九龠别集》卷四《负情侬传》为本事来源,同时以《删补文苑楂橘》、《情史》、《亘史》所收同一作品参校。虽是同一篇作品,但四种版本之间文句差别较大,孙楷第先生经过仔细的比勘,“梳其异同”,整理出一个较为可信的读本。全书类似情况很多,这里不再一一举例。
孙楷第签赠顾颉刚《中国通俗小说提要》
第三种是依据各种史书及其它典籍记载来校正小说作品中的一些人物、地名和数字等。
这无疑是孙楷第先生在小说校勘上的一个创新,它同现代著名史家陈寅恪所创的以诗证史之法在思路上正好相反,但都是将文史打通、融会贯通的高明之举。
中国古代的笔记野史虽然虚构较多,但往往喜欢用真人真事,更多的时候是真伪并存,在叙述一些真实的人物事件时,往往合乎史实,具有一定的史料价值,为史学家所取资。同样,在这种情况下,也可以利用史书及其它书籍的记载来校正小说作品中的一些史实描写,并进行文字上的比勘。
比如《古今小说》卷五《穷马周遭际卖媪》,孙先生选用《太平广记》卷二百二十四《卖 追媪》为本事来源,以谈恺刊本为底本,同时用《新唐书》、《旧唐书》来校正其中人名、数字以及字句上的一些讹误,并在文后的按语中进行说明。
同样,《古今小说》卷三十《明悟禅师赶五戒》一篇,选用《甘泽谣》中的圆观篇为本事来源,以《津逮秘书》本为底本,同时用《太平广记》卷三百八十七、《高僧传》卷二十、《冷斋夜话》卷十相关记载进行参校。
《沧州集》
不过,这种以史证稗的校勘方式也有一定的局限,运用不好,有将小说等同史书的弊端,应限制在一定的范围。从《小说考证》全书来看,孙楷第先生将这种校勘方式只是运用在具体人名、事物以及字句的辩正上,并没有滥用。
但不管怎样,这种新的校勘尝试是有益的,可以解决一些问题,对今天的古籍整理仍有一定启发。
还有一种则是没有它本可资参校,或几种版本文字相同,但字句可疑,难以读通,则依上下句文意来定夺具体的文句。这种校勘方式无疑有一定的风险,对校勘者有较高的要求。不过,从《小说旁证》一书来看,孙楷第先生的意断大多是正确的、合理的。
《小说旁证》并非仅仅是有关本事资料的简单排比,它还融会了作者多年的研究心得,兼具资料汇编和学术论著的特点,具有很高的学术价值。这种心得是以校勘、注释和按语这三种方式来表现的,三者彼此呼应印证,形成一个和谐有序的整体。书中的注释很有特色,同一般的小说选注有所不同。是否出注,不是根据一般读者的情况而是视研究者的情况而定的,故出注不多,但很精。
就其内容而言,大体上可以分成三类:一类是对稀见冷僻字的解释;一类是对较为少见的人名、事件等的解释;还有一类是对本事资料与小说的比较印证。前两种注释,大多引证诸书,往往和校勘结合在一起,并非泛泛而言,这是需要费很大功夫的。
如《二刻拍案惊奇》卷三十六《王渔翁舍镜崇三宝 白水僧盗物丧双生》,孙先生以《夷坚志补》卷七《丰乐楼》为入话部分的本事来源,对“丰乐楼”引《都城纪胜》、《武林旧事》中相关资料进行解释,并纠正了上海坊间印本将其误为“丰楼”的失误,校勘与解释相结合,解决了这一问题。
《中国通俗小说书目》
再如《古今小说》卷三十九《汪信之一死救全家》,孙先生以《桯史》卷六《汪革谣谶》为本事来源,这篇文字“文起简古,且有假借字”,孙先生说他“再三斟酌,校定之,始可读”。一篇文章竟要费如此大的功夫,可见其治学之严谨。
如原文中“荷小校”一语,难以读通,孙先生认为系“荷小枷”之误,并引《效颦集》、《警世通言》和《河南邵氏闻见录》有关记载为证,其校改和解释是十分可信的。书中像这样将校勘和注释融为一体处,还有很多,这里不再赘述。
《小说旁证》一书在各篇之后或段落中附还有数十则按语,采用笔记体,或校正文字、或比较版本的异同、或梳理小说的源流、或考稽事情的真伪,间有对小说思想艺术的评价,长短不拘,形式很是灵活,有不少本身就是一篇很有价值的论文,具有很高的学术品位。
如《醒世恒言》卷四十《马当神风送滕王阁》,孙先生引《摭言》卷五和《分门古今类事》卷三《王勃不贵》条为本事来源,在文后的按语中,就话本结尾所云王勃成道、马当山神庙以及宋元人以马当为“上元水府”事进行考辨,并依次引证《元史》、《太平寰宇记》、《博异志》、《石湖居士诗集》、《山谷外集》、《入蜀记》、《真文忠公文集》、《金山志》、《天籁集》、《宋史》、《剧谈录》等十数种书籍进行说明,论证十分详尽,有说服力。
《论中国短篇白话小说》
无论问题的大小,都以前人治经史的功夫去认真解决,这正体现了孙楷第先生严谨精密的学风。对小说本事的溯源考察,对小说间情节、人物、文字异同的梳理辨析,正需要这样的治学精神,可以说,在《小说旁证》一书中,孙楷第先生的学术专长得到了充分的发挥。在今天看来,《小说旁证》一书固然有收录不全的遗憾,但仍极具参考价值。
注释:[1] 郑振铎《论中国短篇白话小说》序,载孙楷第《论中国短篇白话小说》,棠棣出版社1953年版。[2] 胡适《日本东京所见中国小说书目提要》序,载《胡适古典文学研究论集》,上海古籍出版社1988年版。[3] 同注2。[4] 参见杨镰《古典小说戏曲研究的现代第一人孙楷第》,载王瑶主编《中国文学研究的现代化进程》,北京大学出版社1996年版。[5] 据刘乃和先生介绍,孙楷第先生“毕生辛勤搜购的珍贵图书和多年撰写的书稿,以及积累的资料,已损失殆尽”,以致向人诉说时“痛哭不止”。见刘乃和《我所认识的孙楷第先生》,《文学遗产》1991年第3期。关于孙楷第先生的藏书情况,目前还没见人撰文介绍,以其对通俗文学的兴趣,想必收藏此类书籍不少。近日读书,见到一则资料,聊记于此:“戏曲小说家孙子书(楷第)氏,昨在厂肆购得翼圣堂原刻精图本笠翁十种曲,共计二十册,首尾俱全。闻此刻极罕见,殊为名贵。”载1935年1月8日天津《大公报》。[6] 郑振铎《论中国短篇白话小说》序,载孙楷第《论中国短篇白话小说》,棠棣出版社1953年版。[7] 该文见孙楷第《沧州后集》,中华书局1985年版。[8] 谭正璧《三言两拍资料·凡例》,上海古籍出版社1980年版。[9] 谭氏本人也承认该书“获助他山,实非浅鲜。在此必须特别提出者,则为孙楷第先生与赵景深先生多种有关三言、两拍之著作。有此诸作之提示与启发,所省搜检功夫,奚啻倍菥”。谭正璧《三言两拍资料·后记》,上海古籍出版社1980年版。
举报/反馈
热依扎上台发表获奖感言
台下的孙俪的眼睛一直红通通的
孙俪真的帮了热依扎好多!
依扎和孙俪戏外是真朋友啊。
举报/反馈
举报/反馈
孙允珠韩国嫩模,橘色低胸连衣裙穿搭,性感撩人
孙允珠韩国嫩模,橘色低胸连衣裙穿搭,性感撩人
孙允珠韩国嫩模,橘色低胸连衣裙穿搭,性感撩人
孙允珠韩国嫩模,橘色低胸连衣裙穿搭,性感撩人
孙允珠韩国嫩模,橘色低胸连衣裙穿搭,性感撩人
孙允珠韩国嫩模,橘色低胸连衣裙穿搭,性感撩人
孙允珠韩国嫩模,橘色低胸连衣裙穿搭,性感撩人
举报/反馈