05_线程同步

引入:两人同时取同一账户的钱 两个线程访问同一资源,进程之间协调的问题

解决:在进程访问独占资源时先锁定再访问 synchronized 最好只锁定一个对象

加锁过程中:一个方法做了同步(加锁)另一个方法没有做同步,别的线程可以访问没做同步的方法,并且能影响已经同步的方法,要保护需要的同步的对象,必须对要访问的对象所有方法要仔细考虑加不加同步,加同步效率变低,不加同步有可能产生数据不一致的后果

读写两方法,写的方法加锁。

两个方法都改了同一个值,两个方法都应该加同步



public class TestSync implements Runnable { Timer timer = new Timer(); public static void main(String args[]){ TestSync test = new TestSync(); Thread t1 = new Thread(test); //创建了两个线程, 一条路分成了两条 Thread t2 = new Thread(test); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } public void run(){ timer.add(Thread.currentThread().getName()); } } class Timer{ private static int num = 0; public void add(String name){ num ++; try{ Thread.sleep(1); }catch (InterruptedException e) {} System.out.println(name+",你是第" + num +"个使用timer的线程"); } } 输出:

t2,你是第1个使用timer的线程
t1,你是第2个使用timer的线程


改掉其中一段代码

class Timer{ private static int num = 0; //改成1, 输出会出现3 public void add(String name){ synchronized(this){ //锁,就可以把上面的 num成员变量给锁住 num ++; try{ Thread.sleep(1); }catch (InterruptedException e) {} System.out.println(name+",你是第" + num +"个使用timer的线程"); } } }

就可以输出:

t1,你是第1个使用timer的线程
t2,你是第2个使用timer的线程

转载于:https://www.cnblogs.com/firecode/archive/2012/02/19/2460902.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值