A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

2,发现运行结果每一次都不同
因为多个线程都获取cpu的执行权,cpu执行到谁,就运行谁
明确一点,在某一时刻,只能有一个程序在运行(多核除外)
cpu在做着快速的切换,以达到看上去是同时运行的效果

我们可以形象的把多线程的运行形容为在互相抢夺cpu的执行权

这就是多线程的一个特性:随机性,也就是谁抢到,谁执行,至于执行多长时间,目前cpu决定
回复 使用道具 举报
实现方式和继承方式有什么区别?
实现方式的好处:避免了单继承的局限性
在定义线程的时候,建议使用实现方式
两种方式的区别:线程代码存放的位置不同
继承Thead:线程代码存放在Thread子run方法中
实现Runnable:线程代码存放在接口的子类的run方法
回复 使用道具 举报
7,安全问题:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误

解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行

java对于多线程的安全问题提供了专业的解决方式:同步代码块
synchronized(任意对象)

        需要被同步的代码;


对象如同锁,持有锁的线程可以在同步中执行
不持有锁的线程即使获取了cpu的执行权,也进不去
例子:火车上的卫生间--经典

同步的前提:第一,必须要有两个或者两个以上的线程;第二,必须是多个线程使用同一个锁
必须保证同步中只有一个线程在运行

好处:解决了多线程的安全问题
弊端:多个线程需要判断锁,较为消耗资源

如何查找多线程中的安全问题:
第一,明确哪些代码是多线程运行代码
第二,明确共享数据
第三,明确多线程运行代码中哪些是操作共享数据的

同步的两种体现形势:同步代码块和同步函数两种,其中同步函数就只要在定义函数的函数名前面加上synchronized即可,连建立对象的过程都省了。

那么同步函数用的是哪一个锁呢?
函数需要被对象调用,函数都有一个所属对象的引用,就是this
所以同步函数使用的锁是this

如果同步函数被静态以后,使用的锁:不是this,因为静态方法中也不可以定义this
静态进内存的时候,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class,该对象的类型是Class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象:类. Class
回复 使用道具 举报
什么时候再搞搞这样的活动啊
回复 使用道具 举报
pray 高级黑马 2014-4-25 21:40:36
885#
这个活动挺好,沙发
回复 使用道具 举报
解我燃眉之急
回复 使用道具 举报
这命中率 呵呵
回复 使用道具 举报
版主刚看到这个活动 所以来试试运气

多线程基础.rar

152.93 KB, 下载次数: 94

回复 使用道具 举报
这个我还没学到,我在学对象,求分
回复 使用道具 举报
阿童木 发表于 2014-3-14 22:29
单进程多线程:多个人在同一台服务器上一起工作。

求技术分
回复 使用道具 举报
这个看看书挺简单的,,单进程多线程就是榨取CPU的潜力
回复 使用道具 举报
送个技术分吧!!!!
回复 使用道具 举报
送个技术分吧!!!!
回复 使用道具 举报
送个技术分吧!!!!
回复 使用道具 举报
什么情况啊??难道被骗了
回复 使用道具 举报
进程是操作系统中正在执行的不同应用程序的一个实例。一个进程可以包含一个或多个线程。线程是操作系统分配处理器时间的基本单元。
回复 使用道具 举报
这个活动好,支持!
回复 使用道具 举报
求送技术分啊,每天都要有进步
回复 使用道具 举报
真的有技术分吗?
回复 使用道具 举报
我的分儿啊何时才够~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马