java多线程并发(一)

  1. 为什么要并发编程?
  • 多线程并发处理会提升性能,为了让程序运行的更快。但是,并不是启动更多的线程能让程序最大限度的并发执行。
  1. 并发编程会面临什么样的问题?
  • 并发编程会面临非常多的挑战,比如:上下文切换问题、死锁问题、以及受限于硬件和软件的资源限制问题。

2.1 什么是上下文切换?
- CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。
上下文切换会带来什么样的影响?

  • 上下文的切换会影响多线程的执行速度

    如何减少上下文切换?

  • 减少上下文切换的方法:无锁并发编程、CAS算法、使用最少线程和使用协程。

    无锁并发编程:多线程竞争锁时,会引起上下文切换,可以用一些方法来避免使用锁。
    如:将数据的ID按照Hash算法取模分段,不同的线程处理不同的数据。

    CAS算法:java的Atomic包使用CAS算法来更新数据,不需加锁。

    使用最少线程:避免创建不必要的线程,这样就不会造成大量线程处于等待状态。

    协成:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

2.2 什么是死锁?

  • 所谓死锁是指多个进程循环等待它方占有的资源,而无限期地僵持不去的局面。

    死锁会带来什么样的影响?

  • 一旦产生死锁,就会造成系统功能不可用。

    避免死锁常用的方法:

    避免一个线程同时获得多个锁。 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
    尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
    对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

    2.3 什么是资源限制?

  • 在并发编程时,程序的执行速度受限于计算机硬件资源或者软件资源。
    硬件资源限制有带宽的上传和下载速度、硬件读写速度和CPU的处理速度。
    软件资源限制有数据库的连接数和Socket连接数等。

    资源限制引发的问题?

  • 并发编程的原则是将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码并发执行时,因为受限于资源,仍然在串行执行,程序不仅不会加快,反而会更慢。

    如何解决资源限制问题?

    • 对于硬件资源限制,如使用集群并行执行程序。例如使用ODPS、Hadoop或者自己搭建服务器集群,不同的机器处理不同的数据。

    • 对于软件资源受限,如使用资源池将资源复用。例如使用连接池将数据库和Socket连接复用,或者在调用对方webservice接口获取数据时,建立一个连接。

3.什么是线程:

  • 线程是现代操作系统调度的最小单位,又叫轻量级进程,在一个进程里可以创建多个线程,这些线程拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉这些线程在同时执行。而一个java程序的运行不仅仅总是main()方法的运行,而是main线程和多个其他线程同时运行。
**为什么要使用多线程?**

> 1.随着处理器上的核心数量越来越多,现在大多数计算机都比以往更加擅长并行计算,如果程序使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着处理器核心的加入而变得更有效。

2.响应用户请求的线程能够尽可能快地处理完成,缩短了响应时间,提升了用户体验。

**创建线程的目的:**
  • 为了开启一条执行路径,去运行指定的代码和其他代码实现并行运行。开启线程是为了运行指定代码,所以必须要有Thread类对象或是其子类对象。

4 创建线程的两种传统方式:

  • (继承Thread类,复写run()方法;单独实现Runnable接口然后把其对象传入Thread构造器,这两种方法都必须调用Start来开启线程)

    4.1:创建Thread的子类,覆盖其中的run方法,运行这个子类的start方法即可开启线程

public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {   //重写run()方法
while (true) {
try {
Thread.sleep(500);  //线程休眠500毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1" +Thread.currentThread().getName());  //得到当前线程
System.out.println("2" +Thread.currentThread().getName());
}
};
thread.start();  //启动线程
*4.2  创建Thread时传递一个实现Runnable接口的对象实例*
public static void main(String[] args) {
Thread thread2 = new Thread(new Runnable() { //传入一个Runnable接口的实例
@Override
public void run() {  //重写run方法
while (true) {
try {
Thread.sleep(500);   //线程休眠500毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("4" +Thread.currentThread().getName()); //得到当前线程
System.out.println("3" +Thread.currentThread().getName());
}
}
}); 
thread2.start();   //启动线程 
}

注:执行线程的时候可以使用start()方法或者是run()方法,虽然使用run方法会达到同样的效果,但是run是在主线程中使用的,也就是使用了当前的方法内线程,而不是另起一个线程,这样就达不到异步的效果。所以务必使用start()。

  • 总结:多线程并不一定会提高程序的运行效率。如:一个人同时在三张桌子做馒头
    多线程下载:并不是自己电脑快了,而是抢到更多服务器资源。例:服务器为一个客户分配一个20K的线程下载,你用多个线程,服务器以为是多个用户就分配了多个20K的资源给你。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容