Java多线程synchronized关键字
synchronized关键字代表着同步的意思,在Java中被synchronized修饰的有三种情况
1.同步代码块
//锁为obj
synchronized(obj){
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
2.同步函数
//锁为this
public synchronized void consume() {
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
3.静态同步函数
//锁为this.getClass()
static public synchronized void consume() {
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
死锁案例
1.同步嵌套
package threaddemo; public class DeathLock {
public static void main(String[] args) {
Callable c1 = new Callable(true);
Callable c2 = new Callable(false); Thread t1 = new Thread(c1);
Thread t2 = new Thread(c2); t1.start();
/*try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
t2.start();
}
} class MyLock {
static final public Object locka = new Object();
static final public Object lockb = new Object();
} class Callable implements Runnable {
private boolean flag; public Callable(boolean flag) {
this.flag = flag;
} @Override
public void run() {
String name = Thread.currentThread().getName();
if (flag) {
synchronized (MyLock.locka) {
System.out.println(name+":获取到了locka");
synchronized (MyLock.lockb) {
System.out.println(name+":获取到了lockb");
}
System.out.println(name+":释放了lockb");
}
System.out.println(name+":释放了locka"); } else {
synchronized (MyLock.lockb) {
System.out.println(name+":获取到了lockb");
synchronized (MyLock.locka) {
System.out.println(name+":获取到了locka");
}
System.out.println(name+":释放了locka");
}
System.out.println(name+":释放了lockb");
}
}
}
2.多生产者多消费者时只使用notify(),线程通讯死锁
解决办法采用notifyAll代替notify,唤醒所有线程就不会导致死锁
package threaddemo; /**
* 多生产者消费者线程通讯死锁
* @author wpy
*
*/
public class ProducerConsumerDeathLock {
public static void main(String[] args) {
Resource resource = new Resource(); Producer producer0 = new Producer(resource);
Producer producer1 = new Producer(resource); Consumer consumer2 = new Consumer(resource);
Consumer consumer3 = new Consumer(resource); Thread t0 = new Thread(producer0);
Thread t1 = new Thread(producer1);
Thread t2 = new Thread(consumer2);
Thread t3 = new Thread(consumer3); t0.start();
t1.start(); t2.start();
t3.start(); } } class Producer implements Runnable {
private Resource resource; public Producer(Resource resource) {
this.resource = resource;
} @Override
public void run() {
while (true) {
resource.set("资源");
}
}
} class Consumer implements Runnable {
private Resource resource; public Consumer(Resource resource) {
this.resource = resource;
} @Override
public void run() {
while (true) {
resource.out();
}
}
} class Resource {
private String name;
private int count = 1;
// 是否生成完毕
private boolean flag = false; public synchronized void set(String name) {
String threadName = Thread.currentThread().getName();
while (flag) {
try {
System.out.println(threadName+"进入等待状态");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(threadName+"取得执行权"); this.name = name + count;
count++;
System.out.println("生产者:" + this.name);
flag = true;
this.notify();
// this.notifyAll();
} public synchronized void out() {
String threadName = Thread.currentThread().getName();
while (!flag) {
try {
System.out.println(threadName+"进入等待状态");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(threadName+"取得执行权"); System.out.println("============消费者:" + name);
flag = false;
this.notify();
// this.notifyAll();
}
}
代码执行结果:
Thread-0取得执行权
生产者:资源1
Thread-0进入等待状态
Thread-1进入等待状态
Thread-3取得执行权
============消费者:资源1
Thread-3进入等待状态
Thread-2进入等待状态
Thread-0取得执行权
生产者:资源2
Thread-0进入等待状态
Thread-1进入等待状态
Java多线程synchronized关键字的更多相关文章
- Java 多线程 —— synchronized关键字
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java 多线程 - Synchronized关键字
目录 1-Synchronized 关键字概述 2- Synchronized关键字作用域 3- Synchronized 原理(反编译指令解释) 正文 1-Synchronized 关键字概述 由于 ...
- Java多线程-synchronized关键字
进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...
- java多线程 synchronized关键字的一些用法
看这篇文章啦: http://blog.csdn.net/xiao__gui/article/details/8188833
- Java的synchronized关键字:同步机制总结
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程 ...
- Java 多线程 - synchronize 关键字
目录 Java 多线程 - synchronize 关键字 Java 多线程 - synchronize 关键字 学习自 http://cmsblogs.com/?p=2071 https://www ...
- java基础Synchronized关键字之对象锁
java中Synchronized关键字之对象锁 当有多个线程对一个共享数据进行操作时,需要注意多线程的安全问题. 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同 ...
- java中synchronized关键字分析
今天我们来分析一下java中synchronized关键字.首先来看一段java代码:(本地编译环境为mac,jdk1.8的环境) Demo.java package com.example.spri ...
- Java基础-synchronized关键字的用法(转载)
synchronized--同步 顾名思义是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...
随机推荐
- 深入浅出数据结构C语言版(22)——排序决策树与桶式排序
在(17)中我们对排序算法进行了简单的分析,并得出了两个结论: 1.只进行相邻元素交换的排序算法时间复杂度为O(N2) 2.要想时间复杂度低于O(N2),算法必须进行远距离的元素交换 而今天,我们将对 ...
- 【bzoj1103】【POI2007】【大都市】(树状数组+差分)
在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之 ...
- Apache shiro的简单介绍与使用(与spring整合使用)
apache shiro框架简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密.现在,使用Apache Shiro的人越来越多,因为它 ...
- 在linux上安装rz、sz包
在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于RHEL5, rz/sz默认没有安装所以需要手工安装.sz: 将选定的文件发送(send) ...
- webapp 启动 手机app
<div class="downLoad clearfix"> <div onclick="jsOpenApp.Close(this);" c ...
- VS2017 编译 chromium和webrtc
Chromium的编译和WebRTC的编译方式相同,WebRTC官网也是使用的Chromium的编译文档. 步骤一.跳 - 墙,先跳 - 墙这是第一步哟,chromium大概有10几个G,webrtc ...
- js 防止变量冲突
解决方法 sc1 和sc2 的a都是window.a 会指向一个变量 1:使用匿名函数将脚本包起来,全局变量用来通信 如window.x; 2:命名空间 代码: <script> (fun ...
- Python实战之Selenium自动化测试web登录(2)
#!/usr/bin/env python3 # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver ...
- 深度学习入门篇--手把手教你用 TensorFlow 训练模型
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:付越 导语 Tensorflow在更新1.0版本之后多了很多新功能,其中放出了很多用tf框架写的深度网络结构(https://git ...
- linux_base_commond_two
1.linux privilege commond a.throught ll commond can get follow picture d directory - file l ...