1.demo

说明:代码中通过 printNum 方法传入参数判断 a、b 分别对 num 这个参数的值进行了修改。

package demo1;

import sun.applet.Main;

public class MyThread2 extends Thread {

    private  int num = 0;
public synchronized void printNum(String str) {
try {
if (str.equals("a")) {
num = 1000;
System.err.println("thread -> A over");
Thread.sleep(1000);
} else if (str.equals("b")) {
num = 200;
System.err.println("thread -> B over");
}
System.err.println("str:" + str + "\tnum:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
//2个不同的对象,只能new一次
final MyThread2 n1 = new MyThread2();
final MyThread2 n2 = new MyThread2();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
n1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
n2.printNum("b");
}
});
t1.start();
t2.start();
}
}
结果输出:

      thread -> A over
      thread -> B over

      a休眠2秒后
      str:b num:200
      str:a num:1000

 

描述:

synchronized  结果中并没有发生作用,正常的结果应该是:先执行完a,在执行b。

Thread.sleep(1000): 让当前线程挂起、停顿,交出当前线程占用cpu的时间(在某个时间内,把资源给别人,当前线程在这个时间不占用),使其他线程与当前的线程抢占cpu资源,让2个线程重新分配资源,让另一个线程抢到资源并执行。

2.demo

package demo1;

import sun.applet.Main;
public class MyThread2 extends Thread { private static int num = 0;
public static synchronized void printNum(String str) { try {
if (str.equals("a")) {
num = 1000;
System.err.println("thread -> A over");
Thread.sleep(1000);
} else if (str.equals("b")) {
num = 200;
System.err.println("thread -> B over");
}
System.err.println("str:" + str + "\tnum:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
//2个不同的对象,只能new一次
final MyThread2 n1 = new MyThread2();
final MyThread2 n2 = new MyThread2();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
n1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
n2.printNum("b");
}
});
t1.start();
t2.start();
}
}
结果输出:

      thread -> A over
      str:a num:1000
      thread -> B over
      str:b num:200

 

描述:多个线程多个锁,每个线程都会去拿到属于自己的锁,分别获得后,执行  synchronized  修饰的方法。

   1.synchronized  取得的锁都是对象锁,而不是把一段代码、方法的锁,多个线程就持有该所属的对象锁。2个对象,线程获取的就是2个不同的锁(相互午影响)。

   2.有一种情况就是【相同的锁】,就是在该方法 synchronized 使用static 关键字,表示锁定class类,类级别的锁(独占class类)。

synchronized 线程同步-类级别锁定的更多相关文章

  1. java synchronized 线程同步机制详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  2. java多线程之synchronized(线程同步)

    一.线程同步,主要应用synchronized关键字: public class TraditionalThreadSynchorinzed { public static void main(Str ...

  3. Java线程同步类容器和并发容器(四)

    同步类容器都是线程安全的,在某些场景下,需要枷锁保护符合操作,最经典ConcurrentModifiicationException,原因是当容器迭代的过程中,被并发的修改了内容. for (Iter ...

  4. Java synchronized 线程同步

    同步方法 class MyTheard4 implements Runnable{ private int ticket; public MyTheard4(int ticket) { this.ti ...

  5. synchronized 线程同步

    synchronized  通常用来形容一次方法的调用,调用一旦开始,调用者必须等到方法调用返回后,才能继续执行后续的操作. 1.demo package demo1; public class My ...

  6. 对象级别锁 vs 类级别锁(Java)

    前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...

  7. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  8. iOS多线程编程:线程同步总结

    1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一 ...

  9. C#多线程编程系列(三)- 线程同步

    目录 1.1 简介 1.2 执行基本原子操作 1.3 使用Mutex类 1.4 使用SemaphoreSlim类 1.5 使用AutoResetEvent类 1.6 使用ManualResetEven ...

随机推荐

  1. java.util.ConcurrentModification并发修改异常

    在运行下面这段代码时出现了并发修改异常java.util.ConcurrentModification: public static void main(String[] args) { List l ...

  2. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术

    第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...

  3. react todolist

    import React, {Component} from 'react'; class AddItem extends React.Component { constructor(props) { ...

  4. 微信小程序 - 时间进度条功能

    关于答题类,或者一些游戏环节的小程序需要用到时间进度条,改功能怎么实现看下面源码 <view class='out' style='margin-top:10px'> <view c ...

  5. bzoj 1485 卡特兰数 + 分解因子

    思路:打表可以看出是卡特兰数,但是模数不一定是素数,所以需要分解一下因数. #include<bits/stdc++.h> #define LL long long #define fi ...

  6. Unable to find a qt build, to solve this problem specify a qt build

    可能路径设置不对,比如大小写错误导致找不到qmake编译器,点击VS工具栏的QT菜单,选择options,指定qt Build所在的路径(qt安装路径),然后点击ok. 这是修改过默认安装路径的

  7. 丑数(LintCode)

    丑数 设计一个算法,找出只含素因子3,5,7 的第 k大的数. 符合条件的数如:3,5,7,9,15...... 您在真实的面试中是否遇到过这个题? Yes 样例 如果k=4, 返回 9 挑战 要求时 ...

  8. Xamarin.Forms获取设备屏幕大小

    Xamarin.Forms获取设备屏幕大小 可以借助device.Display获取.基本形式如下: var display = device.Display;然后就可以获取屏幕大小.display. ...

  9. Mixins 改成使用高阶组件调用

    把组件放在另外一个组件的 render 方法里面, 并且利用了 {...this.props} {...this.state} 这些  JSX 展开属性 对比下2种代码: 原始方式: <!DOC ...

  10. About 分块

    分块的的复杂度是带根号的.... 然后,它是一种暴力算法 简单来说就是优化过的暴力 分块算法会对一个序列(长度为N)进行划分,每一块最多有K个元素,这样就会分为N/K块: 一般K取sqrt(N),那么 ...