2.2.9静态同步synchronized方法与synchronized(class)代码块
关键字synchronized还可以应用在static静态方法上,这样写那是对当前的*.java文件对应的class类进行持锁,
测试如下
package com.cky.bean; /**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread; import com.cky.bean.Service; /**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{ @Override
public void run() {
super.run();
Service.printA();
}
}
package com.cky.thread; import com.cky.bean.Service; /**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ @Override
public void run() {
super.run();
Service.printB();
}
}
package com.cky.test; import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA();
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB();
threadB.setName("b");
threadB.start();
}
}
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend Process finished with exit code 0
程序运行结果:
同步的效果,和将synchronized关键字加到非static方法上使用的效果一致,但还是存在本质上的区别,synchronized加到static静态方法上时给Class类上锁,而加到非static静态方法上是给对象上锁。
为了验证不是同一个锁,测试如下。
package com.cky.bean; /**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } synchronized public void printC(){
System.out.println("printc ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printc ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread; import com.cky.bean.Service; /**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{ @Override
public void run() {
super.run();
Service.printA();
}
}
package com.cky.thread; import com.cky.bean.Service; /**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ @Override
public void run() {
super.run();
Service.printB();
}
}
package com.cky.thread; import com.cky.bean.Service; /**
* Created by edison on 2017/12/8.
*/
public class ThreadC extends Thread{ private Service service; public ThreadC(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printC();
}
}
package com.cky.test; import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB;
import com.cky.thread.ThreadC; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA();
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB();
threadB.setName("b");
threadB.start();
ThreadC threadC = new ThreadC(service);
threadC.setName("c");
threadC.start();
}
}
C:\itsoft\jdk\bin\java -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\itsoft\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\itsoft\jdk\jre\lib\charsets.jar;C:\itsoft\jdk\jre\lib\deploy.jar;C:\itsoft\jdk\jre\lib\ext\access-bridge-32.jar;C:\itsoft\jdk\jre\lib\ext\cldrdata.jar;C:\itsoft\jdk\jre\lib\ext\dnsns.jar;C:\itsoft\jdk\jre\lib\ext\jaccess.jar;C:\itsoft\jdk\jre\lib\ext\jfxrt.jar;C:\itsoft\jdk\jre\lib\ext\localedata.jar;C:\itsoft\jdk\jre\lib\ext\nashorn.jar;C:\itsoft\jdk\jre\lib\ext\sunec.jar;C:\itsoft\jdk\jre\lib\ext\sunjce_provider.jar;C:\itsoft\jdk\jre\lib\ext\sunmscapi.jar;C:\itsoft\jdk\jre\lib\ext\sunpkcs11.jar;C:\itsoft\jdk\jre\lib\ext\zipfs.jar;C:\itsoft\jdk\jre\lib\javaws.jar;C:\itsoft\jdk\jre\lib\jce.jar;C:\itsoft\jdk\jre\lib\jfr.jar;C:\itsoft\jdk\jre\lib\jfxswt.jar;C:\itsoft\jdk\jre\lib\jsse.jar;C:\itsoft\jdk\jre\lib\management-agent.jar;C:\itsoft\jdk\jre\lib\plugin.jar;C:\itsoft\jdk\jre\lib\resources.jar;C:\itsoft\jdk\jre\lib\rt.jar;C:\多线程核心技术\第一章\out\production\第一章;C:\itsoft\idea\IntelliJ IDEA 2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
printA ThreadNameabegin
printc ThreadNamecbegin
printc ThreadNamecend
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend
结果可见:
a和b和c是异步执行的,而不是按顺序执行的,因为一个是对象锁,一个是class锁,而class锁可以对所有的实例起作用
测试如下
package com.cky.bean; /**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread; import com.cky.bean.Service; /**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{
private Service service; public ThreadA(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printA();
}
}
package com.cky.thread; import com.cky.bean.Service; /**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ private Service service; public ThreadB(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printB();
}
}
package com.cky.test; import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service1 = new Service();
Service service2 = new Service();
ThreadA threadA = new ThreadA(service1);
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB(service2);
threadB.setName("b");
threadB.start(); }
}
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend
同步synchronized(class)代码块的作用和synchronized static 方法一样,
测试如下修改Service类如下
package com.cky.bean; /**
* Created by edison on 2017/12/8.
*/
public class Service { public static void printA() {
try {
synchronized (Service.class) {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} } catch (InterruptedException e) {
e.printStackTrace();
}
} public static void printB(){
synchronized(Service.class) {
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end");
} } }
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend
2.2.9静态同步synchronized方法与synchronized(class)代码块的更多相关文章
- 2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块
1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中 可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...
- static方法,属性,代码块初始化顺序和执行顺序
http://greateryang.blog.163.com/blog/static/81953375201232621031508/
- 深入理解Java中的同步静态方法和synchronized(class)代码块的类锁
一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷
构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- Synchronized方法锁、对象锁、类锁区别
synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...
- java两种同步机制的实现 synchronized和reentrantlock
java两种同步机制的实现 synchronized和reentrantlock 双11加保障过去一周,趁现在有空,写一点硬货,因为在进入阿里之后工作域的原因之前很多java知识点很少用,所以记录一下 ...
- 多线程同步锁和死锁以及synchronized与static synchronized 的区别
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序.简而言之:一个程序运行后至少有一个进程,一个进程 ...
随机推荐
- javascript 生存周期
生存周期: 局部 JavaScript 变量 在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域是局部的). 您可以在不同的函数中使用名 ...
- Android——Activity练习
manifests里的AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> < ...
- Numpy array 合并
1.np.vstack() :垂直合并 >>> import numpy as np >>> A = np.array([1,1,1]) >>> ...
- git clone时出现:"diffie-hellman-group1-sha1 "
解决办法1:在用户配置目录下添加一个ssh配置文件 vim /root/.ssh/config 内容如下: Host * KexAlgorithms +diffie-hellman-group1-s ...
- 修改别人写的Hibernate数据库操作代码
最近正在维护别人写的一个关于Hibernate操作数据库的项目,在运行测试的时候(向表中插入记录),报了一个错误:cannot insert a null into column(XXX字段名,下文统 ...
- BZOJ1977或洛谷4180 [BJWC2010]次小生成树
一道LCA+生成树 BZOJ原题链接 洛谷原题链接 细节挺多,我调了半天..累炸.. 回到正题,我们先求出随便一棵最小生成树(设边权和为\(s\)),然后扫描剩下所有边,设扫到的边的两端点为\(x,y ...
- LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图
#6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- msdn
https://docs.microsoft.com/en-us/cpp/standard-library/basic-string-class?view=vs-2017
- rap2与postman自动化测试
rap2的接口数据可以全部导入postman: 在collections集合里面点击run;
- keepalived+nginx+tomcat+redis集群环境部署
1.所需软件.jar包.配置文件下载:http://pan.baidu.com/s/1dFgntst 2.环境说明: centos6.5 64位 主节点:192.168.40.121 副节点:192 ...