首页编程java编程java 什么时候加锁(javacc++等高级语言,读操作需要加锁吗)

java 什么时候加锁(javacc++等高级语言,读操作需要加锁吗)

编程之家2023-10-11117次浏览

大家好,关于java 什么时候加锁很多朋友都还不太明白,今天小编就来为大家分享关于java/c/c++等高级语言,读操作需要加锁吗的知识,希望对各位有所帮助!

java 什么时候加锁(javacc++等高级语言,读操作需要加锁吗)

Java中有哪些锁,区别是什么

【1】公平所和非公平所。

公平锁:是指按照申请锁的顺序来获取锁,

非公平所:线程获取锁的顺序不一定按照申请锁的顺序来的。

java 什么时候加锁(javacc++等高级语言,读操作需要加锁吗)

//默认是不公平锁,传入true为公平锁,否则为非公平锁

ReentrantLock reentrantLock= new ReetrantLock();

1

java 什么时候加锁(javacc++等高级语言,读操作需要加锁吗)

2

【2】共享锁和独享锁

独享锁:一次只能被一个线程所访问

共享锁:线程可以被多个线程所持有。

ReadWriteLock读锁是共享锁,写锁是独享锁。

【3】乐观锁和悲观锁。

乐观锁:对于一个数据的操作并发,是不会发生修改的。在更新数据的时候,会尝试采用更新,不断重入的方式,更新数据。

悲观锁:对于同一个数据的并发操作,是一定会发生修改的。因此对于同一个数据的并发操作,悲观锁采用加锁的形式。悲观锁认为,不加锁的操作一定会出问题,

【4】分段锁

1.7及之前的concurrenthashmap。并发操作就是分段锁,其思想就是让锁的粒度变小。

【5】偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价

轻量级锁

重量级锁

【6】自旋锁

自旋锁

java线程同步问题

首先,你如果要线程同步的话,那么需要用关键字去定义。你如果不去定义让线程同步的话,那么线程永远都是串行的,因为每个时间片段只会执行一部分

Java线程:线程的同步-同步方法

线程的同步是保证多线程安全访问竞争资源的一种手段。

线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题?

在本文之前,请参阅《Java线程:线程的同步与锁》,本文是在此基础上所写的。

对于同步,在具体的Java代码中需要完成一下两个操作:

把竞争访问的资源标识为private;

同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

当然这不是唯一控制并发安全的途径。

synchronized关键字使用说明

synchronized只能标记非抽象的方法,不能标识成员变量。

为了演示同步方法的使用,构建了一个信用卡账户,起初信用额为100w,然后模拟透支、存款等多个操作。显然银行账户User对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,禁止直接访问。

/**

* Java线程:线程的同步

*

*@author leizhimin 2009-11-4 11:23:32

*/

public class Test{

public static void main(String[] args){

User u= new User("张三", 100);

MyThread t1= new MyThread("线程A", u, 20);

MyThread t2= new MyThread("线程B", u,-60);

MyThread t3= new MyThread("线程C", u,-80);

MyThread t4= new MyThread("线程D", u,-30);

MyThread t5= new MyThread("线程E", u, 32);

MyThread t6= new MyThread("线程F", u, 21);

t1.start();

t2.start();

t3.start();

t4.start();

t5.start();

t6.start();

}

}

class MyThread extends Thread{

private User u;

private int y= 0;

MyThread(String name, User u, int y){

super(name);

this.u= u;

this.y= y;

}

public void run(){

u.oper(y);

}

}

class User{

private String code;

private int cash;

User(String code, int cash){

this.code= code;

this.cash= cash;

}

public String getCode(){

return code;

}

public void setCode(String code){

this.code= code;

}

/**

*业务方法

*@param x添加x万元

*/

public synchronized void oper(int x){

try{

Thread.sleep(10L);

this.cash+= x;

System.out.println(Thread.currentThread().getName()+"运行结束,增加“"+ x+"”,当前用户账户余额为:"+ cash);

Thread.sleep(10L);

} catch(InterruptedException e){

e.printStackTrace();

}

}

@Override

public String toString(){

return"User{"+

"code='"+ code+'\''+

", cash="+ cash+

'}';

}

}

输出结果:

线程A运行结束,增加“20”,当前用户账户余额为:120

线程F运行结束,增加“21”,当前用户账户余额为:141

线程E运行结束,增加“32”,当前用户账户余额为:173

线程C运行结束,增加“-80”,当前用户账户余额为:93

线程B运行结束,增加“-60”,当前用户账户余额为:33

线程D运行结束,增加“-30”,当前用户账户余额为:3

Process finished with exit code 0

反面教材,不同步的情况,也就是去掉oper(int x)方法的synchronized修饰符,然后运行程序,结果如下:

线程A运行结束,增加“20”,当前用户账户余额为:61

线程D运行结束,增加“-30”,当前用户账户余额为:63

线程B运行结束,增加“-60”,当前用户账户余额为:3

线程F运行结束,增加“21”,当前用户账户余额为:61

线程E运行结束,增加“32”,当前用户账户余额为:93

线程C运行结束,增加“-80”,当前用户账户余额为:61

Process finished with exit code 0

很显然,上面的结果是错误的,导致错误的原因是多个线程并发访问了竞争资源u,并对u的属性做了改动。

可见同步的重要性。

注意:

通过前文可知,线程退出同步方法时将释放掉方法所属对象的锁,但还应该注意的是,同步方法中还可以使用特定的方法对线程进行调度。这些方法来自于java.lang.Object类。

void notify()

唤醒在此对象监视器上等待的单个线程。

void notifyAll()

唤醒在此对象监视器上等待的所有线程。

void wait()

导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()方法。

void wait(long timeout)

导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()方法,或者超过指定的时间量。

void wait(long timeout, int nanos)

导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

java中的锁有哪几种

lock比synchronized比较如下:

1)支持公平锁,某些场景下需要获得锁的时间与申请锁的时间相一致,但是synchronized做不到

2)支持中断处理,就是说那些持有锁的线程一直不释放,正在等待的线程可以放弃等待。如果不支持中断处理,那么线程可能一直无限制的等待下去,就算那些正在占用资源的线程死锁了,正在等待的那些资源还是会继续等待,但是ReentrantLock可以选择放弃等待

3) condition和lock配合使用,以获得最大的性能

JAVA中锁使用的几点建议:

1.如果没有特殊的需求,建议使用synchronized,因为操作简单,便捷,不需要额外进行锁的释放。鉴于JDK1.8中的ConcurrentHashMap也使用了CAS+synchronized的方式替换了老版本中使用分段锁(ReentrantLock)的方式,可以得知,JVM中对synchronized的性能做了比较好的优化。

2.如果代码中有特殊的需求,建议使用Lock。例如并发量比较高,且有些操作比较耗时,则可以使用支持中断的所获取方式;如果对于锁的获取,讲究先来后到的顺序则可以使用公平锁;另外对于多个变量的锁保护可以通过lock中提供的condition对象来和lock配合使用,获取最大的性能。

java/c/c++等高级语言,读操作需要加锁吗

java web的话是不需要的,因为每次request请求通过servlet的时候servlet会开启新的线程来执行代码,现在web项目都是使用spring容器的,spring会对线程使用threadlocal,这样会把类中的变量为每个线程复制一份,所以当并发时不会因为未加锁影响其它线程。当然不是绝对的,如果是操作静态变量,应该是要加锁的。

c、c++的话我不是做这个的所以不太了解,就不乱说了。

文章分享结束,java 什么时候加锁和java/c/c++等高级语言,读操作需要加锁吗的答案你都知道了吗?欢迎再次光临本站哦!

java的所有类都是什么的子类(java编程的填空题,java中所有类都是( )类的子类)mainactivity.java是什么?mainactivity.java是什么,有什么用