关于线程同步的一点总结
来源:互联网 发布:奇秀软件下载 编辑:程序博客网 时间:2024/05/18 00:36
小弟自学党一枚,这两天在学习线程的内容,写点东西检验下学习效果吧!一来对自己学过的内容做下巩固,二来要是可以给同在学习的xdjm哪怕一丢丢的借鉴和启发,想必也是极好的。欢迎小伙伴积极拍砖,踊跃发言,废话不多说,上demo程序!
class ThreadDemo {
public static void main(String[] args) {
TestThread t = new TestThread();
new Thread(t).start();
try{Thread.sleep(9);} catch(Exception e) {}
t.s = new String("method");
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestThread implements Runnable //extends Thread
{ String s = new String(""); //监视器对象,保证监视器对象的唯一性
int tickets = 100;
public void run() {
if(s.equals("method")) {
while(true) {
sale();
}
} else {
while(true) {
synchronized(this) {
/*使用此方法时须传入任意一个对象,当某个线程进入同步代码块(synchronized()里的代码)
执行的时候,该对象的标志位(锁旗标)将被设为0,会引起其他线程阻塞,执行完之后同步
代码块后,锁旗标将被重置为1,等待线程的其中一个方可进入代码块中执行,这样就保证了
代码块中永远只有一个线程在执行,保证了代码执行的原子性
*/
if(tickets>0) {
try{
Thread.sleep(10);//线程休眠
System.out.println(Thread.currentThread().getName()+" tickets is saling "+tickets--);
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
}
public synchronized void sale() { //同步函数
if(tickets>0) {
try{
Thread.sleep(10);//线程休眠
System.out.print("sale(): ");
System.out.println(Thread.currentThread().getName()+" tickets is saling "+tickets--);
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
写代码一个宗旨就是务必保证代码要严谨,如果事前不考虑周到,后续可能会出现各种各样的bug,那时候可就悲剧了,得不偿失啊!线程同步在这儿就实现了这个目的,当然,在可以确保线程是安全的情况下,可以不适用同步,线程同步是以牺牲程序性能为前提进行的,因为cpu分配线程的时候要检查其是否阻塞,要花费较多的资源和时间。如以上代码所示,线程同步可以使用三种方法:1、同步代码块(synchronized()里的代码);2、同步方法;3、二者结合起来。上面是一个出售100张票的程序,使用四个线程同时出售这100张票,也就是使用多个相同程序的线程处理同一资源对象,个人觉得,在使用线程的时候去实现Runnable接口远比继承thread类要更加灵活(比如解决了Java单继承所带来的局限性,这里就不多加赘述了),貌似大部分时候也是这样做的。所谓线程同步,其工作的核心机理就是若干个线程使用同一监视器对象,即保证监视器对象的唯一性。好了,就写到这里,不到之处,还望指出,O(∩_∩)O谢谢~~~
- 关于线程同步的一点总结
- 关于线程的一点总结
- 关于线程同步的一点心得
- 关于java中的线程和线程池的一点总结
- 关于线程的同步
- 线程同步的总结
- 线程同步的总结
- 关于线程的一点心得
- 关于线程的一点体会
- 关于线程的一点补充
- 关于线程的一点补充
- 黑马程序员-关于线程同步、死锁的小总结
- 关于多线程的一点总结
- 关于SYS_CONNECT_BY_PATH 的一点总结
- 关于数据库的一点总结
- 关于反编译的一点总结
- 关于dijkstra的一点总结
- 关于floyd的一点 总结
- 函数调用(续)
- ContentProvider之通过ContentResolver获取图像、视频、音频举例
- spring使用xml进行声明式事务管理
- Android开发之横竖屏切换对Activity生命周期的影响
- java JNDI配置与自定义
- 关于线程同步的一点总结
- eclipse连接SQL server2012出现“没有为集成身份验证配置驱动程序”的异常
- Android之openFileoutput和openFileinput
- jre和jdk的区别
- WebView之javascript与android交互基础加强
- 敏捷开发
- Qt tcp client程序
- C# 创建缩略图
- FFmpeg SDK使用实例output_example的分析之一