标签:同步 synchronized 对象 代码 线程 原理 ticket
同步代码块
·同步代码块:synchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。
格式:
package Demo01.Sychronized; public class RunnableImpl implements Runnable{ //定义一个多线程共享的票源 private int ticket =100; //创建一个锁对象 Object object=new Object(); //设置线程任务:卖票 @Override public void run() { //使用死循环,让卖票操作重复执行 while(true){ synchronized (object){ //先判断票是否存在 if (ticket>0){ //提高安全问题出现的概率,让程序睡眠 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,卖票 ticket-- System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票"); ticket--; } } } } //定义一个多线程共享的票源 }
同步技术的原理
同步技术的原理:
使用了一个锁对象,这个锁对象叫同步锁,也叫对象锁,也叫对象监视器
3个线程一起抢夺cpu的执行权,谁抢到了谁执行run方法进行卖票
to抢到了cpu的执行权,执行run方法,遇到synchronized代码块
这时t0会检查synchronization代码块是否有锁对象
发现有,就会获取到锁对象,进入到同步中执行
t1抢到了cpu的执行权,执行run方法,遇到synchronized代码块这时t1会检查synchronized代码块是否有锁对象
发现没有,t1救护进入到阻塞状态,会一直等待t0线程归坏锁对象
一直到t0线程执行完同步中的代码块,会把锁对象归还给同步代码块
t1才能获取到锁对象进入到同步中执行
总结:同步中的线程,没有执行完毕不会释放锁,同步外的线程没有锁进不去同步
标签:同步,synchronized,对象,代码,线程,原理,ticket 来源: https://www.cnblogs.com/leijia/p/16456103.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。