java线程同步<二>

[b][size=medium]为了解决 线程安全问题,也就是多个线程访问同一个实例变量,而引入了同步的概念[/size]。[/b]

[b]不加同步的代码块[/b]:


package com.xxg.reflect;

public class Test3 {


public static void main(String[] args) {

CSD cs = new CSD();
Thread th1 = new Thread(cs);
Thread th2 = new Thread(cs);
th1.start();
th2.start();



}

}
class CSD implements Runnable{

public int a ;
public void run() {


a++;
try {
Thread.sleep(1000);
System.out.println("【当前线程】-----"+Thread.currentThread().getName()+"----a---"+a);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}



}
//===============================测试结果=======================

【当前线程】-----Thread-0----a---2
【当前线程】-----Thread-1----a---2



[color=brown][b]从上面结果看,在第一个线程执行run()方法时,进入sleep()后,第二个线程修改了实例变量所以打印的结果都为2[/b][/color]
[b]
加了同步方法的代码块:[/b]



package com.xxg.reflect;

public class Test3 {


public static void main(String[] args) {

CSD cs = new CSD();
Thread th1 = new Thread(cs);
Thread th2 = new Thread(cs);
th1.start();
th2.start();



}

}
class CSD implements Runnable{

public int a ;
public void run() {
synchronized (this) {


a++;
try {
Thread.sleep(1000);
System.out.println("【当前线程】-----"+Thread.currentThread().getName()+"----a---"+a);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


}
//========================测试结果================================
【当前线程】-----Thread-0----a---1
【当前线程】-----Thread-1----a---2



[b]解释:[size=medium]加上synchronized后:表示当前线程获得该对象锁了,其他线程无法进入锁定区域,直到当前线程执行完该方法体,释放对象才能[/size]。[/b]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值