J***a中对本身线程安全的方法加锁,锁不会被优化掉吗?
jvm会优化无竞争状态下的锁,但它还是锁,不会优化掉。我自己的工具类里都会重写BufferedInputStream/BufferedOutputStream,只是简单的把synchronized去掉,性能会提高很多。
j***a中如何保证多线程顺序执行?
谢邀。
首先j***a多线程的目的是为了并发执行而不是顺序执行,如果多线程顺序的话那就和单线程没有区别。
但是“顺序”还是有意义的,就是逻辑上要求几个操作保证顺序,这里就指的就是as if serial。即多线程大多数时候都是并发执行,但是在访问同步资源时通过同步器让线程顺序,如synchronize,lock,aqs等。
同时在cpu指令层面也是同样,指令重排序看起来是乱序执行,但在执行效果上和顺序一样。这些机制的初衷都是:让程序执行的更快。
希望回答有帮助。
j***a多线程知识讲解?
对于J***a编程的多线程知识,我们还是要了解很多的,首先我们要知道。j***a中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。
Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。
j***a的线程安全是什么?谁能一言以蔽之?
这个还真不能一句话概况,我博客写了一长篇关于线程安全的,我提炼了下面这段,看懂也基本够了:
单线程不会有安全问题,多线程编程才会有安全问题,根本在于是否存在critical resource竞争***,如果多线程不会访问竞争***就不存在安全问题,否则则要处理,
什么是竞争***呢,具体如下:
如果是各自访问其上下文context的***,比如kafka consumer partition worker线程访问各自的storage则是互相不打扰的;
如果执行的某个方法内只用到了局部变量,由于局部变量位于各自thread的栈里,所以互不干扰;
如果执行的某个方法用到了传入的变量,也就是所谓的形式参数变量,则要看这个传入的变量是否是object,如果只是普通的参数则没关系,如果是对象,要看对象是否是同一个引用,不同引用没有关系;
如果执行的某个方法内用到了同一个引用,不管是传入的还是外部全局的变量,比如log4的logger,由于log4已经做好了线程安全写log,所以不用担心;
如果执行的某个方法内用到了同一个引用:
i)但是只是读没有写,读和读是没有冲突的,也没有关系;
ii)都有写,但是写不依赖于读,即线程不需要获取“最新”数据就可以直接写入覆盖,这种情况也没有关系;
iii)都有写,而且写依赖于读到最新数据,则需要处理;
学生类:
class A{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//学生类使用方法:
public class test(){
public static void main(String[] args) {
A[] students = new A[2]; //创建2个学生的学生数组
A as= new A();
as.setAge(15);
as.setName(“tom”);
A as1= new A();
as1.setAge(16);
as1.setName(“cat”);
A[] a={as,as1}; //动态创建学生数组
for (A st : a) {//遍历数组
System.out.println(st.getName()+”;”);
}
}
}
想了解更多J***a相关,百度搜索圈T社区***.aiquanti***,免费视频教程。纯干货