java 中关于synchronized的通常用法
- package j2se.thread.test;
- /***
- * synchronized(class)很特别,它会让另一个线程在任何需要获取class做为monitor的地方等待.
- * class与this做为不同的监视器可以同时使用,不存在一个线程获取了class,另一个线程就不能获取该class的一切实例.
- 根据下面的代码自行修改,分别验证下面的几种情况:
- synchronized(class)
- synchronized(this)
- ->线程各自获取monitor,不会有等待.
- synchronized(this)
- synchronized(this)
- ->如果不同线程监视同一个实例对象,就会等待,如果不同的实例,不会等待.
- synchronized(class)
- synchronized(class)
- ->如果不同线程监视同一个实例或者不同的实例对象,都会等待.
- */
- /**
- * @author liwei
- 测试synchronized(this)与synchronized(class)
- */
- public class TestSynchronied8 {
- private static byte[] lockStatic = new byte[0]; // 特殊的instance变量
- private byte[] lock = new byte[0]; // 特殊的instance变量
- public synchronized void m4t5() {
- System.out.println(this);
- int i = 50;
- while( i-- > 0) {
- System.out.println(Thread.currentThread().getName() + " : " + i);
- try {
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- }
- Thread.yield();
- }
- }
- public void m4t0() {
- synchronized(this) {
- System.out.println(this);
- int i = 50;
- while( i-- > 0) {
- System.out.println(Thread.currentThread().getName() + " : " + i);
- try {
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- }
- Thread.yield();
- }
- }
- }
- public void m4t1() {
- synchronized(lock) {
- System.out.println(this);
- int i = 50;
- while( i-- > 0) {
- System.out.println(Thread.currentThread().getName() + " : " + i);
- try {
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- }
- Thread.yield();
- }
- }
- }
- /**
- * synchronized(class)
- synchronized(class)
- ->如果不同线程监视同一个实例或者不同的实例对象,都会等待.
- */
- public static synchronized void m4t2() {
- int i = 50;
- while( i-- > 0) {
- System.out.println(Thread.currentThread().getName() + " : " + i);
- try {
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- }
- Thread.yield();
- }
- }
- public static void m4t3() {
- synchronized(TestSynchronied8.class){
- int i = 50;
- while( i-- > 0) {
- System.out.println(Thread.currentThread().getName() + " : " + i);
- try {
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- }
- Thread.yield();
- }
- }
- }
- public static void m4t4() {
- synchronized(lockStatic){
- int i = 50;
- while( i-- > 0) {
- System.out.println(Thread.currentThread().getName() + " : " + i);
- try {
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- }
- Thread.yield();
- }
- }
- }
- /**
- synchronized(this)
- synchronized(this)
- ->如果不同线程监视不同的实例,不会等待.
- */
- public static void testObjsyn1(){
- final TestSynchronied8 myt2 = new TestSynchronied8();
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- System.out.println("测试两个不同的对象上,运行同一个synchronized(this)代码块-------------------------------------");
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t1 = new Thread( new Runnable() { public void run() { myt1.m4t0(); } }, "t1" );
- Thread t2 = new Thread( new Runnable() { public void run() { myt2.m4t0(); } }, "t2" );
- t1.start();
- t2.start();
- }
- /**
- synchronized(this)
- synchronized(this)
- ->如果不同线程监视同一个实例,会等待.
- */
- public static void testObjsyn2(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- System.out.println("测试一个对象上,运行同一个synchronized(this)代码块-------------------------------------");
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t3 = new Thread( new Runnable() { public void run() { myt1.m4t0(); } }, "t3" );
- Thread t4 = new Thread( new Runnable() { public void run() { myt1.m4t0(); } }, "t4" );
- t3.start();
- t4.start();
- }
- /**
- synchronized(this)
- synchronized(this)
- ->如果不同线程监视同一个实例,会等待.
- */
- public static void testObjsyn3(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- System.out.println("测试一个对象上,运行同一个synchronized(obj)代码块-------------------------------------");
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t5 = new Thread( new Runnable() { public void run() { myt1.m4t1(); } }, "t5" );
- Thread t6 = new Thread( new Runnable() { public void run() { myt1.m4t1(); } }, "t6" );
- t5.start();
- t6.start();
- }
- /**
- synchronized(this)
- synchronized(this)
- ->如果不同线程监视同一个实例,会等待.
- */
- public static void testObjsyn4(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- System.out.println("测试一个对象上,运行同一个synchronized方法-------------------------------------");
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt1.m4t5(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t5(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- synchronized(this)
- synchronized(this)
- ->如果不同线程监视不同的实例,不会等待.
- */
- public static void testObjsyn5(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- final TestSynchronied8 myt2 = new TestSynchronied8();
- try {
- System.out.println("测试两个不同对象上,运行同一个synchronized方法-------------------------------------");
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t9 = new Thread( new Runnable() { public void run() { myt1.m4t5(); } }, "t9" );
- Thread t10 = new Thread( new Runnable() { public void run() { myt2.m4t5(); } }, "t10" );
- t9.start();
- t10.start();
- }
- /**
- synchronized(this)
- synchronized方法
- ->如果不同线程监视同一实例,一个是syschronized(this),一个是同步方法,会等待.
- */
- public static void testObjsyn6(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t9 = new Thread( new Runnable() { public void run() { myt1.m4t0(); } }, "t9" );
- Thread t10 = new Thread( new Runnable() { public void run() { myt1.m4t5(); } }, "t10" );
- t9.start();
- t10.start();
- }
- /**
- synchronized(lock)
- synchronized方法
- ->如果不同线程监视同一实例,一个是syschronized(lock),一个是同步方法,不会等待.
- */
- public static void testObjsyn7(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t9 = new Thread( new Runnable() { public void run() { myt1.m4t1(); } }, "t9" );
- Thread t10 = new Thread( new Runnable() { public void run() { myt1.m4t5(); } }, "t10" );
- t9.start();
- t10.start();
- }
- /**
- synchronized(lock)
- synchronized方法
- ->如果不同线程监视同一实例,一个是syschronized(lock),一个是syschronized(this),不会等待.
- */
- public static void testObjsyn71(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t9 = new Thread( new Runnable() { public void run() { myt1.m4t0(); } }, "t9" );
- Thread t10 = new Thread( new Runnable() { public void run() { myt1.m4t1(); } }, "t10" );
- t9.start();
- t10.start();
- }
- /**
- * synchronized(class)
- synchronized(class)
- ->如果不同线程监视不同的实例对象,会等待.
- */
- public static void testObjsyn8(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- final TestSynchronied8 myt2 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t2 = new Thread( new Runnable() { public void run() { myt2.m4t2(); } }, "t2" );
- Thread t4 = new Thread( new Runnable() { public void run() { myt1.m4t2(); } }, "t4" );
- t2.start();
- t4.start();
- }
- /**
- * synchronized(class)
- synchronized(class)
- ->如果不同线程监视同一的实例对象,会等待.
- */
- public static void testObjsyn9(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t2 = new Thread( new Runnable() { public void run() { myt1.m4t2(); } }, "t2" );
- Thread t4 = new Thread( new Runnable() { public void run() { myt1.m4t2(); } }, "t4" );
- t2.start();
- t4.start();
- }
- /**
- * synchronized(class)
- synchronized(this)
- ->线程各自获取monitor,不会有等待.
- */
- public static void testObjsyn10(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- final TestSynchronied8 myt2 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt2.m4t0(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t3(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- * synchronized(class)
- synchronized(this)
- ->线程各自获取monitor,不会有等待.
- */
- public static void testObjsyn11(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt1.m4t0(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t3(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- * synchronized(class)
- synchronized(lock)
- ->线程各自获取monitor,不会有等待.
- */
- public static void testObjsyn12(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt1.m4t1(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t3(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- * synchronized(class)
- synchronized(lockStatic)
- ->线程各自获取monitor,不会有等待.
- */
- public static void testObjsyn13(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt1.m4t4(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t3(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- * synchronized方法
- synchronized(lockStatic)
- ->线程各自获取monitor,不会有等待.
- */
- public static void testObjsyn14(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt1.m4t4(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t2(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- * synchronized方法
- synchronized(lockStatic)
- ->线程各自获取monitor,不会有等待.
- */
- public static void testObjsyn15(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt1.m4t3(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t2(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- * synchronized方法
- synchronized(lockStatic)
- ->线程各自获取monitor,不会有等待.
- */
- public static void testObjsyn16(){
- final TestSynchronied8 myt1 = new TestSynchronied8();
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread t7 = new Thread( new Runnable() { public void run() { myt1.m4t1(); } }, "t7" );
- Thread t8 = new Thread( new Runnable() { public void run() { myt1.m4t4(); } }, "t8" );
- t7.start();
- t8.start();
- }
- /**
- * synchronized(class)和static synchronized 方法所获取的锁是一样的
- * synchronized(class)方法和静态的方法中的 synchronized(lockStatic)代码块获取的锁是不一样的
- * 非静态的方法中的synchronized(this)代码块和非静态的 synchronized 方法所获取的锁是一样的
- * (静态和非静态) synchronized(this)和(静态和非静态)的 synchronized(lock)代码块获取的锁是不一样的
- *
- * 总的来说synchronized(class)和static synchronized 方法获取的是类锁
- * 非静态的方法中的synchronized(this)代码块和非静态的 synchronized 方法所获取的锁是类的实例的对象锁
- * synchronized(lockStatic)获取的是静态属性的锁
- * synchronized(lock) 获取的是非静态属性的锁
- * 如果获取的锁是一样的,代码就会同步 ;锁不一样就不会同步
- */
- public static void main(String[] args) {
- //对于非静态的方法,同步方法和 synchronized(this) 获取的是实例对象锁
- //对于非静态的方法,同步方法和 synchronized(lock) 获取的锁的lock
- // testObjsyn1();//如果不同线程监视不同的实例,不会等待. synchronized(this)
- // testObjsyn2();//如果不同线程监视同一个实例,会等待. synchronized(this)
- // testObjsyn3();//如果不同线程监视同一个实例,会等待. synchronized(lock)
- // testObjsyn4();//如果不同线程监视同一个实例,会等待. synchronized 方法
- // testObjsyn5();//如果不同线程监视不同的实例,不会等待. synchronized 方法
- // testObjsyn6();//如果不同线程监视同一实例,一个是syschronized(this),一个是同步方法,会等待
- // testObjsyn7(); //如果不同线程监视同一实例,一个是syschronized(lock),一个是同步方法,不会等待,锁定的对象不一样的
- // testObjsyn71(); //如果不同线程监视同一实例,一个是syschronized(lock),一个是syschronized(this),不会等待,锁定的对象不一样的
- /**
- * synchronized(class)
- synchronized(class)
- ->如果不同线程监视同一个实例或者不同的实例对象,都会等待.
- */
- // testObjsyn8();//如果不同线程监视不同的实例对象,会等待.synchronized(class)
- // testObjsyn9();//如果不同线程监视同一的实例对象,会等待.synchronized(class)
- // testObjsyn10();//如果不同线程监视不同的实例对象,不会等待.synchronized(class),synchronized(this)
- // testObjsyn11();//如果不同线程监视同一的实例对象,不会等待.synchronized(class),synchronized(this)
- // testObjsyn12();//如果不同线程监视同一的实例对象,不会等待.synchronized(class),synchronized(lock)
- // testObjsyn13();//如果不同线程监视同一的实例对象,不会等待.synchronized(class),synchronized(lockStatic)
- // testObjsyn14();//如果不同线程监视同一的实例对象,不会等待.synchronized()方法,synchronized(lockStatic)
- // testObjsyn15();//如果不同线程监视同一的实例对象,会等待.synchronized()方法,synchronized(class)
- // testObjsyn16();//如果不同线程监视同一的实例对象,不会等待.synchronized(lock)方法,synchronized(lockStatic)
- }
- }
java 中关于synchronized的通常用法的更多相关文章
- 巨人大哥谈Java中的Synchronized关键字用法
巨人大哥谈Java中的Synchronized关键字用法 认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就 ...
- JAVA中字符串函数subString的用法小结
本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...
- 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...
- java中 this 的三种用法
Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 ...
- Java中枚举的写法和用法
在公司代码中,用了一大堆的枚举,看得我好懵逼.下面开始看看枚举怎么写和怎么用. 一.枚举的写法 关于枚举的写法,网上好多这方面的知识.这里直接贴一个我自己写的枚举类的代 ...
- Java中try,catch,finally的用法
Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下. Java异常处理的组合方式: 1.try+catch 运行流程:运行到try ...
- 对kotlin和java中的synchronized的浅谈
synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...
- Java中的Synchronized关键字用法
认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方加上synchronized修饰符基本上就搞定 了,如果说不考虑性能问题的话,这一招绝对能应对 ...
- 深入理解java中的synchronized关键字
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D ...
随机推荐
- Mifare系列5-存储结构(转)
文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38081521 Mifare S50把1K字节的容量分为16个扇区(Sector0 ...
- pyqt4学习笔记
信号与槽机制 信号与槽机制作为Qt最重要的特性,提供了任意两个Qt对象之间的通信机制.其中,信号会在某个特定情况或动作下被触发,槽是用于接收并处理信号的函数.例如,要将一个窗口中的变化情况通知给另一个 ...
- C++学习注意点
1.cin,cout关同步再用,不然效率很糟cin,cout关同步再用,不然效率很糟cin,cout关同步再用,不然效率很糟.重要的事情说三遍.关同步代码:std::ios::sync_with_st ...
- 使用时间戳和sequence生成主键的function
create or replace function fn_getKeyreturn varchar2is k varchar2(30);begin select to_char(sysdate, ...
- GitHUb 代码提交遇到的问题以及解决办法
git 添加代码出现以下错误: fatal: Unable to create 'F:/wamp/www/ThinkPhpStudy/.git/index.lock': File exists. If ...
- JPA,EclipseLink 缓存机制学习(一) 树节点搜索问题引发的思考
最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...
- ROWID伪列
ROWID伪列概念: 在数据表中每一行所保存的记录,oracle会为每条记录分配一个唯一的地址编号,这个编号就是通过ROWID表示的. 所有的数据都利用ROWID进行定位. 观察rowid的存在 SQ ...
- angularjs不同页面间参数的传递
1.在路由中定义要接收的参数 .state('userDetails', { url: '/userDetails?phone', //以?为标识接收参数 templateUrl: 'assets/v ...
- Java主函数定义
public static void main(String[] args){} public: main主方法是由jvm来调用的,jvm实际也是一个程序,为了保证jvm能够在任何情况下来调用主函数. ...
- 为 iTween 指定特定的回调 : onupdate, oncomplete
问题地址:Specifying a delegate for the value of onupdate in iTween 1.找到 void CallBack 2.修改以下代码: void Cal ...