synchronized 关键字的作用一个词概括就是:线程同步。它可以将将对象或者Class加锁,用来防止两个线程同时访问一个数据。
看如下代码:
package com.test.runnable; public class DoSomething implements Runnable{ private String name; public DoSomething(String name){ this.name = name; } public void run(){ for(int i = 0; i < 5;i++){ System.out.println(name+":"+i); } } }
package com.test.runnable; public class TestRunnable { public static void main(String argc[]){ DoSomething ds1 = new DoSomething("张三"); DoSomething ds2 = new DoSomething("李四"); Thread t1 = new Thread(ds1); Thread t2 = new Thread(ds2); t1.start(); t2.start(); } }
输出结果为:
张三:0
李四:0
张三:1
李四:1
张三:2
张三:3
张三:4
李四:2
李四:3
李四:4
可以发现并不是张三输出完了再输出李四。
然后给输出的语句块加上synchronized 关键字,如下:
package com.test.runnable;
public class DoSomething implements Runnable{
private String name;
public DoSomething(String name){
this.name = name;
}
public void run(){
synchronized(this){
for(int i = 0; i < 5;i++){
System.out.println(name+":"+i);
}
}
}
}
但发现,再次运行发现还是乱序,原因是synchronized(this)获得的是对象锁,t1运行时获得的是ds1对象的锁,t2运行时获得的是ds2的对象锁,两个互不干扰,所以此时synchronized无效。要时synchronized有效,可以将代码改成如下:
package com.test.runnable;
public class TestRunnable {
public static void main(String argc[]){
DoSomething ds1 = new DoSomething("张三");
DoSomething ds2 = new DoSomething("李四");
Thread t1 = new Thread(ds1);
Thread t2 = new Thread(ds1);
t1.start();
t2.start();
}
}
也可以将锁的范围由对象改为类,这样t1运行时获得的是DoSomething.class的锁,t2运行时再获得 DoSomething.class的锁时发现不能获得,等待t1的synchronized块运行完释放锁时才能得到。代码如下:
package com.test.runnable;
public class DoSomething implements Runnable{
private String name;
public DoSomething(String name){
this.name = name;
}
public void run(){
synchronized(DoSomething.class){
for(int i = 0; i < 5;i++){
System.out.println(name+":"+i);
}
}
}
}
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其他synchronized(this)同步代码块得访问将被阻塞。
看如下代码:
package com.test.runnable;
public class DoSomething implements Runnable{
private String name;
public DoSomething(String name){
this.name = name;
}
public void doA(){
synchronized(this){
for(int i = 0; i < 5;i++){
System.out.println("做A事情:"+name+":"+i);
}
}
}
public void doB(){
synchronized(this){
for(int i = 0; i < 5;i++){
System.out.println("做B事情:"+name+":"+i);
}
}
}
public void run(){
doA();
doB();
}
}
package com.test.runnable; public class TestRunnable { public static void main(String argc[]){ DoSomething ds1 = new DoSomething("张三"); Thread t1 = new Thread(ds1); Thread t2 = new Thread(ds1); t1.start(); t2.start(); } }
当t1运行到doB时,理论上doA已经解锁了。这时t2可以运行doA代码。但实际上,由于t1此时对象锁还没释放,t2也不能获得对象锁,也不能运行doA的代码。只能等t1运行完doB释放对象锁了,t2才能开始运行doA
相关推荐
你还在用synchronized?线程安全相关知识深入剖析
synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
java中synchronized用法
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
java里面synchronized用法
Synchronized锁在Spring事务管理下,导致线程不安全。
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
This document specifies the third version of the Synchronized Multimedia Integration Language (SMIL, pronounced "smile"). SMIL 3.0 has the following design goals: ● Define an XML-based language...
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新
java同步synchronized关键字用法示例
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来
Synchronized关键字的用法
java中synchronized的使用,java中的锁锁的到底是什么?是括号里的代码块吗?肯定不是的;
有需要2014版本之前的Synchronized 6-Pulse Generator元器件,提供slx文件下载,直接复制过去即可使用。Matlab表示:如果您的旧版型号包含 同步6脉冲发生器模块,它们将继续工作。但是,为获得最佳性能,请在新型号...
synchronized关键字在java中的重要性 以及常用的方法 还有它的详解
java语言 并发编程 ReentrantLock与synchronized区别 详解