关键字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)代码块的更多相关文章

  1. 2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

    1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...

  2. static方法,属性,代码块初始化顺序和执行顺序

    http://greateryang.blog.163.com/blog/static/81953375201232621031508/

  3. 深入理解Java中的同步静态方法和synchronized(class)代码块的类锁

    一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www ...

  4. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  5. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

  6. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  7. Synchronized方法锁、对象锁、类锁区别

    synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...

  8. java两种同步机制的实现 synchronized和reentrantlock

    java两种同步机制的实现 synchronized和reentrantlock 双11加保障过去一周,趁现在有空,写一点硬货,因为在进入阿里之后工作域的原因之前很多java知识点很少用,所以记录一下 ...

  9. 多线程同步锁和死锁以及synchronized与static synchronized 的区别

    线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序.简而言之:一个程序运行后至少有一个进程,一个进程 ...

随机推荐

  1. YII2中使用控制台命令

    有些时候我们需要通过crontab在后台跑一些定时脚本,这时候就需要用到控制台命令了. 我们在commands目录下创建TestController.php,当然脚本的位置是可以随意指定的,只需要在c ...

  2. MongoDB安装成为Windows服务及日常使用遇到问题总结

    安装MongoDB: http://blog.csdn.net/liuzhoulong/article/details/6124566 严格按照上面的步骤,设置数据库目录,设置日志目录,安装服务.可是 ...

  3. python 3.6.5 map() max() lambda匿名函数

    python 3.6.5 sample: map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 functi ...

  4. idea spring-boot gradle mybatis 搭建开发环境

    使用工具idea 2017.2开发,gradle构建项目,使用的技术有spring-boot.mybatis 1.新建项目 说明:1.src为源码路径,开发主要在src下 2.src/main/jav ...

  5. 28335XINTF的简单使用

    28335 XINTF基本特点 一共有三个外部存储区域:区域0(Zone 0),区域6(Zone 6)和区域7(Zone 7).对应的 访问地址为:Zone 0:0x0000_4000-0x0000_ ...

  6. 显示实现接口的好处c#比java好的地方

    所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方.这种做法的学名叫做Structural Typing,有人 ...

  7. Netty 源码(二)NioEventLoop 之 Channel 注册

    Netty 源码(二)NioEventLoop 之 Channel 注册 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一 ...

  8. sqli-labs:18-22,http头部注入

    sqli18: uname和passwd被处理了: uagent和ip插入到了数据库: 还带回显. 抓包改包 sqli19: null sqli20: 审计代码,大概如下 当我们正常登录后userna ...

  9. 学习python 多进程和多线程

    ''' 学习多进程和多线程 ''' import multiprocessing def deadLoop(): while True: pass if __name__ == '__main__': ...

  10. 【WebService】WebService基础知识(一)

    WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际) ...