问题很简单. -Xss参数用于控制线程的堆栈大小.
Java过去很长一段时间只能通过synced关键字实现互斥,这有一些缺点. 例如,您不能扩展除锁或块边界以外的方法,也不能在尝试获取锁时中途取消. Java 5通过Lock接口提供了更复杂的控制来解决这些问题. ReentrantLock类实现了Lock,它具有与同步相同的并发性和内存语义,并且还可以扩展.
在多线程中,有多种方法允许线程按特定顺序执行. 您可以使用线程的join()方法启动线程中的另一个线程,然后另一个线程完成该线程并继续执行. 为了确保三个线程的顺序,您应该开始最后一个线程(T3调用T2,T2调用T1),以便T1首先完成,T3最后完成.
Yield方法可以挂起当前正在执行的线程对象,并允许其他具有相同优先级的线程执行. 这是一种静态方法,仅保证当前线程放弃CPU使用率,并且不能保证其他线程一定会占用CPU. 进入挂起状态后,可以立即再次执行执行yield()的线程.
ConcurrentHashMap将实际映射分为几部分,以实现其可伸缩性和线程安全性. 该划分使用并发获得. 它是ConcurrentHashMap类构造函数的可选参数. 默认值为16java多线程避免死锁,因此在多线程的情况下可以避免竞争.
Java中的信号量是一个新的同步类,它是一个计数信号. 从概念上讲,信号量维护一组权限. 如有必要,将在许可证可用之前阻止每个acquire(),然后获取许可证. 每个release()添加一个许可证,该许可证可能会释放阻止获取者. 但是,信号量不是使用实际的许可证对象,而是仅计算可用许可证的数量并采取相应的措施. 信号量通常用于多线程代码中,例如连接池.
这个问题非常狡猾,许多程序员会认为任务将阻塞,直到线程池队列空闲为止. 实际上,如果无法安排任务的执行时间,则ThreadPoolExecutor的Submit()方法将引发RejectedExecutionException.
这两个方法都可以将任务提交到线程池. execute()方法的返回类型为void,这是在Executor接口中定义的,submit()方法可以返回保存计算结果的Future对象,该对象在ExecutorService中定义. 在该接口中,它扩展了Executor接口,其他线程池类(例如ThreadPoolExecutor和ScheduledThreadPoolExecutor)都具有这些方法.
阻塞方法意味着程序将始终等待该方法完成而无需执行其他任何操作. ServerSocket的Accept()方法将等待客户端连接. 在这里阻塞意味着在调用结果返回之前,当前线程将被挂起,直到获得结果后才返回. 此外,还有异步和非阻塞方法会在任务完成之前返回.
您可以确定Swing不是线程安全的,但是即使面试官没有问您原因,您也应解释该答案的原因. 当我们说swing不是线程安全的时,我们经常提到它的组件. 这些组件不能在多个线程中修改. GUI组件的所有更新必须在AWT线程中完成. Swing提供同步和异步回调方法. 要更新.

Swing API为Java开发人员提供了这两种方法,用于从当前线程而不是事件分发线程更新GUI组件. InvokeAndWait()同步更新GUI组件,例如进度条. 更新进度后,进度栏也必须相应更改. 如果进度被多个线程跟踪,则调用invokeAndWait()方法以请求事件分派线程相应地更新组件. invokeLater()方法异步调用更新组件.
此问题还提到摆动和螺纹安全性. 尽管该组件不是线程安全的,但是有些方法可以被多个线程安全地调用,例如repaint(),revalidate(). JTextComponent的setText()方法以及JTextArea的insert()和append()方法也是线程安全的.
这个问题似乎与多线程无关,但是不变性有助于简化已经很复杂的并发程序. 不变对象可以不同步而共享,从而减少了同时访问对象时的同步开销. 但是,Java没有@Immutable批注. 要创建一个不可变的类,您必须执行以下步骤: 通过构造函数初始化所有成员,不提供变量的setter方法,并将所有成员声明为私有,因此要直接使用getter方法访问这些成员,请勿直接返回对象本身,但克隆对象并返回对象的副本. 我的文章“如何使对象成为Java中的不可变对象”有详细的教程,阅读后您可以放心.
通常,读写锁是用于提高并发程序性能的锁分离技术的结果. Java中的ReadWriteLock是Java 5中的新接口. ReadWriteLock维护一对关联的锁,一个用于只读操作,一个用于写入. 如果没有写线程,则多个读线程可以同时持有一个读锁. 写锁是排他的. 您可以在JDK中使用ReentrantReadWriteLock来实现此规则. 它最多支持65535个写锁和65535个读锁.
繁忙循环是程序员使用循环使线程等待的地方. 与传统的方法wait(),sleep()或yield()不同,它们都放弃CPU控制,而busy循环没有放弃CPU,而是运行一个Empty循环. 这样做的目的是保留CPU缓存. 在多核系统中java多线程避免死锁,等待的线程在唤醒时可能会在另一个核中运行,这将重建缓存. 它可用于避免重建缓存并减少等待重建的时间.
这是一个有趣的问题. 首先,易变变量和原子变量看起来相似,但是它们的功能不同. 易变变量可以确保提前关系,即写操作将在后续的读操作之前进行,但不能保证原子性. 例如,如果用volatile修改了count变量,则count ++操作不是原子的. AtomicInteger类提供的原子方法可以使此操作成为原子操作. 例如,getAndIncrement()方法会自动将当前值加1,其他数据类型和引用变量也可以执行类似的操作.
这个问题使很多Java程序员感到困惑. 如果您可以通过此提示线索来考虑是否可以释放锁,则有一点希望是正确的. 不管您的同步块是正常退出还是异常退出,内部线程都会释放锁定,因此我更喜欢同步块而不是锁定接口,因为它不需要我花费精力来释放锁定. 可以通过释放finally块中的锁来实现此功能.
在Java面试中经常会问这个问题,但是面试官对回答这个问题的满意度仅为50%. 一半的人不能编写双重检查锁,一半的人不能告诉隐藏的危险以及Java 1.5如何解决它. 实际上,这是创建线程安全单例的一种旧方法. 首次创建单例实例时,它将尝试使用单个锁来优化性能,但这在JDK1.4中是失败的,因为它太复杂了. 我个人也不喜欢. 无论如何,即使您不喜欢它,您仍然必须理解它,因为它经常被问到.
这是上述问题的后续措施. 如果您不喜欢双重检查锁,并且访问者要求使用其他方法来创建Singleton类,则可以使用JVM的类加载和静态变量初始化功能来创建Singleton实例,或者使用枚举类型来创建Singleton,喜欢使用这种方法.
我最喜欢这种问题. 我相信您在编写并发代码以提高性能时将遵循某些最佳实践. 我认为大多数Java程序员应该遵循以下三个最佳实践:
此问题就像如何强制Java垃圾回收. 目前尚无方法. 尽管可以使用System.gc()进行垃圾回收,但不能保证成功. 无法强制在Java中启动线程. 它由线程调度程序控制,并且Java不发布相关的API.
fork join框架是JDK7中出现的高效工具,Java开发人员可以使用它来利用现代服务器上的多处理器. 它是专为可以递归地分为许多子模块的应用程序而设计的,目的是利用所有可用的处理能力来提高程序的性能. fork联接框架的巨大优势在于它使用了一种工作窃取算法,并且可以完成更多任务的工作线程可以从其他线程中窃取任务来执行.
Java程序中的
等待和睡眠会导致某种形式的暂停,它们可以满足不同的需求. wait()方法用于线程间通信. 如果等待条件为真,并且其他线程被唤醒,它将释放锁定. sleep()方法仅释放CPU资源或停止当前线程一段时间,而不会释放锁.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-273986-2.html
>你敢怎么着