JDK中Thread.State类的几种状态

线程的生命周期









线程的安全问题(同步与互斥)

方法一:同步代码块

多个线程的同步监视器(锁)必须的是同一把,任何一个类的对象都可以

      synchronized(同步监视器){

      }  //说明:操作共享数据的代码,即为需要被同步的代码(对共享数据的操作)

对于Thread实现和Runnable实现,同步锁需要区别

1.Thread下的同同步锁

class WinThread extends Thread{
/*
方式一 继承Thread
*/
private static int ticket=100; //需要设置静态变量
private static Object ticketLock=new Object(); //同步监视器,静态,因为要是共享唯一变量
@Override
public void run() {
while(true)
{
synchronized (ticketLock){
if (ticket > 0)
{
System.out.println(this.getName() + "卖票: " + ticket);
ticket--;
}
else break;
} }
}
}

2.Runnable下的同步锁

class winRunnable implements Runnable{
private int ticket=100; //不用设置成静态变量
private Object obj=new Object(); //声明一个对象为锁 @Override
public void run() {
while(true)
{
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj){ //互斥操作
if (ticket > 0)
{
System.out.println(Thread.currentThread().getName() + "卖票: " + ticket);
ticket--;
}
else break;
}
}
}
}

Thread下可以考虑用WinThread.class当锁,而Runnable下可以考虑用this当锁(总之要分析是不是同一个锁)

自己的坑:不能把共享的数据当作锁(例如WinThread下的int ticket改成Integer后当锁),这里还是会有问题

方法二:同步方法(代码略)

多声明一个对共享数据数据操作的方法,在方法的前面添加声明synchronized,而不是直接在run()前面加

1.同步方法中也涉及到同步锁,但锁是默认的

2.非静态的同步方法,锁是this

静态的同步方法,锁是当前类本身——xxx.class

 *              同步方法synchronized实现runnable接口
* private synchronized void 方法(){//普通同步方法的同步监视器是this
* //需要互斥的代码
* }
 *              同步方法synchronized实现继承Thread类
* 因为不同线程是Thread类的不同对象,所以一般要用静态
* private static synchronized void 方法(){//静态同步方法默认同步监视器是类本身
* //需要互斥的代码
* }

同步的局限性:操作同步代码时,只能有一个线程参与,其他线程等待,相当于互斥量为1

单例模式的同步问题

死锁问题

方法二:Lock(锁) ---JDK5.0新增

class LockRunnable implements Runnable{
private int ticket=100; //不用设置成静态变量
private ReentrantLock lock=new ReentrantLock(true); //true为选择FIFO的公平
@Override
public void run() {
while(true)
{
try { try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} lock.lock();
if (ticket > 0)
{
System.out.println(Thread.currentThread().getName() + "卖票: " + ticket);
ticket--;
}
else break;
}finally {
lock.unlock();
}
}
}
}

面试题:synchronized 与 Lock 的区别

相同:二者都可以解决线程安全问题

不同:synchronized机制在执行完相应的同步代码之后,自动的释放同步监视器

Lock需要手动的启动同步 .lock() ,同时结束同步也需要手动 .unlock()

Java多线程—线程同步(单信号量互斥)的更多相关文章

  1. Java多线程——线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  2. Java多线程 - 线程同步

    多线程操作同一个对象时,容易引发线程安全问题.为了解决线程安全问题,Java多线程引入了同步监视器. 同步代码块 同步代码块语法格式如下: synchronized(obj){ //此处的代码即为同步 ...

  3. JAVA多线程线程同步问题

    线程同步 在多线程的编程环境下,可能看着没有问题的代码在运行几千上万或者更多次后,出现了一些看着很奇怪的问题,出现这样的问题的原因就是可能会有两个或者更多个线程进入了同一块业务处理代码中导致了判断失效 ...

  4. Java中线程同步锁和互斥锁有啥区别?看完你还是一脸懵逼?

    首先不要钻概念牛角尖,这样没意义. 也许java语法层面包装成了sycnchronized或者明确的XXXLock,但是底层都是一样的.无非就是哪种写起来方便而已. 锁就是锁而已,避免多个线程对同一个 ...

  5. Java多线程:线程同步与关键字synchronized

    一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blo ...

  6. Java多线程——线程之间的同步

    Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...

  7. Java多线程-线程的同步(同步方法)

    线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...

  8. Java多线程的同步控制记录

    Java多线程的同步控制记录 一.重入锁 重入锁完全可以代替 synchronized 关键字.在JDK 1.5 早期版本,重入锁的性能优于 synchronized.JDK 1.6 开始,对于 sy ...

  9. Java多线程——线程的创建方式

    Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...

随机推荐

  1. 【Java】这 35 个 Java 代码优化细节!

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  2. 集成SpringCloudBus,但没有总线通知更改

    配置服务端别忘了添加以下2个依赖 implementation("org.springframework.cloud:spring-cloud-config-server")imp ...

  3. 五、关于mycat踩过的坑

    1.ER分表的从表无法批量插入,例如:insert into tab_a(c1,c2) values(v1,v2),(v11,v21)或者使用jdbctemplate进行batchUpdate操作会报 ...

  4. nginx搭建简单直播服务器

    1.下载模块(nginx-rtmp-module) 1 cd /data/nginx 2 yum install git3 git clone https://github.com/arut/ngin ...

  5. C++ | 虚拟地址空间

    在 x86 32位系统下,进程的虚拟地址空间为 232 (4G)大小,其中在windows系统下4G地址空间中0x00000000-0x7FFFFFFF 是用户地址空间,0x80000000-0xFF ...

  6. numpy计算数组中满足条件的个数

    Numpy计算数组中满足条件元素个数 需求:有一个非常大的数组比如1亿个数字,求出里面数字小于5000的数字数目 1. 使用numpy的random模块生成1亿个数字 2. 使用Python原生语法实 ...

  7. 知网上的硕士和博士论文怎么下载pdf格式

    文献管理使用的EndNote,阅读习惯使用Drawboard,在下载硕士和博士论文时在知网上只能下载caj格式,于是就想找一种能下载pdf的方式. 知乎中有篇文章介绍的如何下载pdf的方法,很管用也很 ...

  8. 深入理解ES6之《块级作用域绑定》

    众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制let const 声明不会被提升,有几个需要注意的点1.不能被重复声明 假设作用域 ...

  9. 一个抽取百度定位的教程(下载百度地图Demo+配置+抽取)

    效果展示 已经下载Demo的可以直接到第五步,已经配置好的并可以运行的可以直接到第七步. 1.在浏览器搜索 " 百度定位API ",点击下面这个链接 2.翻到最下面找到并点击 &q ...

  10. CTF大赛模拟-CFS三层内网漫游

    CTF大赛模拟-CFS三层内网漫游 环境: 三台虚拟机,三个网络. target 1:192.168.161.178 ,192.168.52.132 (linux) target 2:192.168. ...