java(6) 多线程(2)

本文探讨了Java中的多线程同步问题,强调了synchronized关键字在确保线程安全方面的作用。同步机制保证了一个线程执行完毕后另一个线程再执行,而synchronized作为暗锁,要求线程持有同一对象锁。文章通过实例展示了synchronized修饰方法和同步块的用法,并提到了线程通信中的wait()和notify()方法的应用,以及避免死锁的策略。
摘要由CSDN通过智能技术生成

定时线程:

机制:在固定时间内,反复执行某个任务 父类是TimerTask

字母和上面日期匹配

爬虫

多线程同步:保证多线程访问的安全     多线程访问安全就是保证 多线程执行顺序的安全

1. 多线程的启动是由JVM调度执行的,不是由程序员或者代码保证。

2.  程序员在多线程进入到运行状态(run)时,对多线程执行的控制,这个控制绝对的。

同步机制就是保证一个线程 执行完毕后,另外一个线程再执行  绝对保证

同步关键字:synchronized 保证线程安全

sunchronized 英文翻译同步,也叫做暗锁

例1:

 

 结果:

 例2:没有保证线程安全,因为没有持有同一个对象锁

继承Thread 用了synchronized没有保证线程安全,主要是需要持有同一个对象锁。(多线程安全前提是同一个对象)

 解决方法:

    new 使用一次   锁必须是同一个对象

 

start和end没必要锁,锁定范围太大,导致执行性能降低。

总结:

synchronized 叫做同步,同步保证多线程执行安全,安全的前提:多个线程必须持有同一个对象锁

synchronized  叫做锁,叫做暗锁  锁的住条件前提:必须是同一个对象

 synchronized两种用法:

        synchronized 修饰方法:同步方法  锁定范围太大,执行性能降低

        synchronized 同步块

暗锁会自动释放,也可以叫自动释放锁。

实际使用推荐用同步块,可以缩小锁的范围(导弹精确制导)

修饰方法的例子(见上面)

同步块的例子(见下面):

创建了两个线程对象所以不可以

不一定用this:

同步块后面释放锁

 

或者这个:

.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

多线程竞争造成了线程不安全:

有一个线程没计算完。

用synchronized锁:

1.同步方法:

2.同步块:

 * 线程生命周期:
 * 1. 创建线程 new 线程对象
 * 
 * 2.  线程进入到可运行状态    start()
 * 
 * 3.线程进入到运行状态
 * 
 * 4. 线程进入到运行状态对线程的状态调度
 *              sleep()  yeild()  join()
 *              synchronized
 *               wait()/notify()
 *             
 * 5. 线程死亡

 线程通信:线程之间交互数据
 *  
 *  1.  主线程向子线程通信传递数据   实现机制:构造函数
 *  
 *  2.  子线程向主线程通信传递数据     子线程合并到主线程(join)   
 *          实现机制  :synchronized   wait()/notify()  

                    wait()/notify()一定要在synchronized同 步机制下
 *  
 *  
 *  3. 子线程和子线程通信传递数据

wait() /notify() 一定要在synchronized同步机制下

主线程安排子线程做一个耗时计算,主线程获取子线程计算的结果。

join()本质是把子线程合并到主线程来计算,所以不符合

去计算1-100之和:

this.notify():通知和它持有同一个对象是锁的被wait的线程继续执行。

如果持有的是当前子线程对象的锁,this.notify();可以不写,默认是有的。    

 必须要是持有同一个对象的锁:

下图,出现了死锁现象

 要把object通过构造函数传过去,这就是主线程向子线程传值:

这就是线程的通信 ,与join( )不同。

一个线程打印奇数和偶数,负载很大

分成两个线程 分别打印 奇偶交替 负载均衡  

为了让这两个线程持有同一个对象,创建一个类:

 

只要是 if() 语句,只有()中的boolean为true时,才能执行if()语句下面的{},如果为false时,执行else下面{};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值