Java Synchronized 略解
2015-07-20 22:01
531 查看
同步条件 ①两个或两个以上 线程对象 用同意堆栈 ② synchronize 锁同一对象
synchrozed (默认)锁的对象是 this
代码验证 :同步条件
打印结果 会出现:Thread-0...show...0
打印结果 :Thread-0...show...1 到此为止
synchrozed (默认)锁的对象是 this
代码验证 :同步条件
class Ticket implements Runnable{ boolean flag = true; private int tick = 1000; Object object = new Object(); public void run() { // TODO Auto-generated method stub if(flag){ while(true){ synchronized (object) { //synchronized 锁object对象 if(tick > 0){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "...show..." + tick--); } } } } else{ while(true){ show(); } } } public synchronized void show() { if(tick > 0){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "...sale..." + tick--); } } } public class Hello { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t.flag = false; t2.start(); } }
打印结果 会出现:Thread-0...show...0
class Ticket implements Runnable{ boolean flag = true; private int tick = 1000; Object object = new Object(); public void run() { // TODO Auto-generated method stub if(flag){ while(true){ synchronized (this) { if(tick > 0){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "...show..." + tick--); } } } } else{ while(true){ show(); } } } public synchronized void show() { if(tick > 0){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "...sale..." + tick--); } } } public class Hello { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t.flag = false; t2.start(); } }
打印结果 :Thread-0...show...1 到此为止
相关文章推荐
- Java回调函数的理解
- Eclipse缺少字体解决办法
- 算法学习之java实现快速排序
- Eclipse 安装最新SVN插件
- Spring 下载
- 解压后的eclipse,把exe文件复制到桌面,但是不能打开?的解决之道
- 【JAVA基础】父类类型做形参
- JAVA基础之继承
- Java多线程使用Synchronized需注意锁的永远是对象
- 打包Java程序,jar转exe并且不依赖java环境
- JAVA实现二分查找
- java学习之旅67--常用类_Calendar和GregorianCalendar的使用_日期计算
- jar包命令行、eclipse下能运行但是双击不能运行,提示找不到main class
- [Spring MVC] - Annotation验证
- Java — 线性查找和二分查找法
- [LeetCode][Java] Construct Binary Tree from Inorder and Postorder Traversal
- java设计模式—工厂模式
- java 设计模式 工厂模式
- [LeetCode][Java] Construct Binary Tree from Preorder and Inorder Traversal
- java之设计模式---工厂方法模式