对synchronized的一点理解.源程序来自马士兵老师的视频教程.
下面这个程序中,num变量刚开始的值为0, t1执行num++后, num变为1,然后t1开始休眠,
t2开始执行,也执行num++,将num变为2, t1休眠完毕,读取到的num变量值为2,t2休眠完后读取到的num变量值为2, 于是就有了类似于"丢失更新"的问题.
public class TongBuTest implements Runnable {
Timer timer = new Timer();
public static void main(String[] args) {
TongBuTest test = new TongBuTest();
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 {
int num = 0;
public void add(String name) {
{
num++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
System.out.println(name + ",你是第" + num + "个使用本方法的线程!");
}
}
}
上述代码运行结果:
t1,你是第2个使用本方法的线程!
t2,你是第2个使用本方法的线程!
在add方法前加上sychronized关键字就能避免这个问题.加上sychronized之后的运行结果为:
t1,你是第1个使用本方法的线程!
t2,你是第2个使用本方法的线程!
再看下面这段代码:
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws InterruptedException {
{
b = 1000;
Thread.sleep(2000);
System.out.println("b=" + b);
}
}
public void m2() {
b=1111;
System.out.println(b);
}
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
TT t = new TT();
Thread thread = new Thread(t);
thread.start();
Thread.sleep(1000);
t.m2();
}
}
运行结果是:
1111
b=1111
我个人的理解是, synchronized只是锁住了语句,使得某一段代码在任意时刻只被一个线程执行, 它并不能锁住这段代码内所涉及的变量资源.
在TongBuTest.java中,加上synchronized关键字后,num++被锁住,t1执行完并输出num值之后才允许t2执行add方法.
在TT.java中, m1方法有synchronized关键字,m1方法体内的所有代码被锁住,但是b这个变量并没有被锁住,所以允许m2方法对b变量进行赋值和读取.
分享到:
相关推荐
个人对synchronized 的理解,可以参考下!!
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
java中synchronized用法
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
你还在用synchronized?线程安全相关知识深入剖析
Synchronized关键字的用法
java里面synchronized用法
java的线程同步机制synchronized关键字的理解_.docx
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
synchronized是很重要的,但是不少人不是很明白synchronized的用法,这里有详细的doc文档给大家参考
我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新
Synchronized与ThreadLocal
目录synchronized的缺陷Lock和ReentrantLock常用方法ReadWriteLock和ReentrantReadWriteLockLock和synchronized区别synchronized锁升级公平锁和非公平锁 synchronized的缺陷 众所周知,synchronized锁是JAVA的关键字...
关于synchronized的自学笔记
java语言 并发编程 ReentrantLock与synchronized区别 详解
java中synchronized的使用,java中的锁锁的到底是什么?是括号里的代码块吗?肯定不是的;
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来